offerApprovalDetail.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. <template>
  2. <main class="offer-approval-page" v-loading="loading">
  3. <header class="detail-page-header">
  4. <div class="drawer-title">
  5. <span><i class="el-icon-view"></i></span>
  6. <div>
  7. <h2>录用审批详情</h2>
  8. <p>{{ form.approvalNo || '—' }}</p>
  9. </div>
  10. <em v-if="form.status" :class="statusTone(form.statusCode)"
  11. ><i></i>{{ form.status }}</em
  12. >
  13. </div>
  14. </header>
  15. <section class="detail-overview">
  16. <span class="candidate-avatar"
  17. ><i class="el-icon-user-solid"></i
  18. ></span>
  19. <div>
  20. <h3>
  21. {{ form.candidateName || '—'
  22. }}<small v-if="form.gender">({{ form.gender }})</small>
  23. </h3>
  24. <p>
  25. {{ form.positionName || '未指定岗位' }} ·
  26. {{ form.departmentName || '未指定部门' }} · 拟入职
  27. {{ form.hireDate || '—' }}
  28. </p>
  29. </div>
  30. </section>
  31. <section class="detail-section">
  32. <div class="detail-heading">
  33. <span><i class="el-icon-user"></i></span>
  34. <div>
  35. <h3>候选人基本信息</h3>
  36. <p>姓名、联系方式与应聘岗位</p>
  37. </div>
  38. </div>
  39. <div class="detail-grid">
  40. <div>
  41. <span>姓名</span><strong>{{ form.candidateName || '-' }}</strong>
  42. </div>
  43. <div>
  44. <span>称谓</span><strong>{{ form.gender || '-' }}</strong>
  45. </div>
  46. <div>
  47. <span>应聘岗位</span><strong>{{ form.positionName || '-' }}</strong>
  48. </div>
  49. <div>
  50. <span>联系电话</span><strong>{{ form.phone || '-' }}</strong>
  51. </div>
  52. <div>
  53. <span>工作经验</span
  54. ><strong>{{ experienceText(form.experience) }}</strong>
  55. </div>
  56. <div>
  57. <span>入职部门</span
  58. ><strong>{{ form.departmentName || '-' }}</strong>
  59. </div>
  60. <div>
  61. <span>学历</span><strong>{{ form.education || '-' }}</strong>
  62. </div>
  63. <div>
  64. <span>当前节点</span><strong>{{ form.currentNode || '-' }}</strong>
  65. </div>
  66. </div>
  67. </section>
  68. <section class="detail-section">
  69. <div class="detail-heading">
  70. <span><i class="el-icon-s-finance"></i></span>
  71. <div>
  72. <h3>录用信息</h3>
  73. <p>薪资、试用期与岗位性质</p>
  74. </div>
  75. </div>
  76. <div class="detail-grid">
  77. <div>
  78. <span>拟定薪资</span
  79. ><strong>{{ form.proposedSalary || '-' }}</strong>
  80. </div>
  81. <div>
  82. <span>试用期</span><strong>{{ form.probation || '-' }}</strong>
  83. </div>
  84. <div>
  85. <span>拟入职日期</span><strong>{{ form.hireDate || '-' }}</strong>
  86. </div>
  87. <div>
  88. <span>薪资结构</span
  89. ><strong>{{ form.salaryStructure || '-' }}</strong>
  90. </div>
  91. <div>
  92. <span>岗位性质</span><strong>{{ form.staffingType || '-' }}</strong>
  93. </div>
  94. </div>
  95. </section>
  96. <section class="detail-section">
  97. <div class="detail-heading">
  98. <span><i class="el-icon-paperclip"></i></span>
  99. <div>
  100. <h3>附件与说明</h3>
  101. <p>简历、面试评价表、Offer 扫描件</p>
  102. </div>
  103. </div>
  104. <div class="detail-block">
  105. <span>附件</span>
  106. <fileMain
  107. v-if="attachmentFileIds.length"
  108. v-model="attachmentFileIds"
  109. type="view"
  110. size="small"
  111. />
  112. <p v-else class="detail-muted">暂无附件</p>
  113. </div>
  114. <div class="detail-block" v-if="form.remark">
  115. <span>备注说明</span>
  116. <p class="review-opinion">{{ form.remark }}</p>
  117. </div>
  118. </section>
  119. </main>
  120. </template>
  121. <script>
  122. import { getHiringApprovalById } from '@/api/bpm/components/offerApproval';
  123. const emptyForm = () => ({
  124. id: null,
  125. approvalNo: '',
  126. candidateName: '',
  127. gender: '',
  128. education: '',
  129. phone: '',
  130. experience: '',
  131. positionName: '',
  132. departmentName: '',
  133. proposedSalary: '',
  134. probation: '',
  135. hireDate: '',
  136. salaryStructure: '',
  137. staffingType: '',
  138. remark: '',
  139. status: '',
  140. statusCode: '',
  141. currentNode: '',
  142. attachmentNames: []
  143. });
  144. export default {
  145. name: 'OfferApprovalDetail',
  146. props: {
  147. businessId: {
  148. default: ''
  149. }
  150. },
  151. data() {
  152. return {
  153. loading: false,
  154. form: emptyForm(),
  155. attachmentFileIds: []
  156. };
  157. },
  158. watch: {
  159. businessId: {
  160. immediate: true,
  161. handler(id) {
  162. if (id) this.getInfo(id);
  163. }
  164. }
  165. },
  166. methods: {
  167. async getInfo(id) {
  168. if (!id) return;
  169. this.loading = true;
  170. try {
  171. this.form = {
  172. ...emptyForm(),
  173. ...(await getHiringApprovalById(id))
  174. };
  175. this.attachmentFileIds = this.form.attachmentFileIds || [];
  176. } catch (error) {
  177. this.form = emptyForm();
  178. this.$message.error(error.message || '录用审批详情加载失败');
  179. } finally {
  180. this.loading = false;
  181. }
  182. },
  183. experienceText(value) {
  184. if (value === null || value === undefined || value === '') return '-';
  185. if (typeof value === 'number' && Number.isFinite(value)) {
  186. return `${value}年`;
  187. }
  188. return String(value);
  189. },
  190. statusTone(code) {
  191. if (code === 'APPROVED') return 'is-success';
  192. if (code === 'REJECTED') return 'is-danger';
  193. if (code === 'PENDING_MY_APPROVAL') return 'is-primary';
  194. return 'is-warning';
  195. }
  196. }
  197. };
  198. </script>
  199. <style lang="scss" scoped src="@/styles/views/offerApproval/index.scss"></style>