user.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. <template>
  2. <div class="hc-page-box">
  3. <HcNewCard>
  4. <template #header>
  5. <div class="w-72">
  6. <el-input
  7. v-model="searchForm.queryValue" clearable placeholder="请输入人员名称查询"
  8. size="large" @keyup="keyUpEvent"
  9. />
  10. </div>
  11. <div class="ml-2">
  12. <el-button :disabled="tableData.length < 1" size="large" type="primary" @click="searchClick">
  13. <HcIcon name="search-2" />
  14. <span>搜索</span>
  15. </el-button>
  16. </div>
  17. </template>
  18. <template #extra>
  19. <HcTooltip keys="tentative_laboratory_user_add">
  20. <el-button hc-btn type="primary" @click="addFormModalClick">
  21. <HcIcon name="add-circle" />
  22. <span>新增</span>
  23. </el-button>
  24. </HcTooltip>
  25. <HcTooltip keys="tentative_parameter_density_edit">
  26. <el-button :disabled="tableCheckedKeys.length <= 0" hc-btn type="primary" color="#12C060" style="color: white;" @click="editFormModalClick">
  27. <HcIcon name="edit" />
  28. <span>编辑</span>
  29. </el-button>
  30. </HcTooltip>
  31. <HcTooltip keys="tentative_laboratory_user_del">
  32. <el-button :disabled="tableCheckedKeys.length <= 0" hc-btn color="#e03997" @click="delModalClick">
  33. <HcIcon name="delete-bin-2" />
  34. <span>删除</span>
  35. </el-button>
  36. </HcTooltip>
  37. </template>
  38. <HcTable
  39. ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading" is-check
  40. border @selection-change="tableSelection"
  41. >
  42. <template #sex="{ row }">
  43. <span>{{ row.sex === 1 ? '男' : '女' }}</span>
  44. </template>
  45. <template #status="{ row }">
  46. <span>{{ row.status === 1 ? '在职' : '离职' }}</span>
  47. </template>
  48. <template #education="{ row }">
  49. <span>{{ arrKeyValue(educationData, 'dictKey', 'dictValue', row.education) }}</span>
  50. </template>
  51. </HcTable>
  52. <template #action>
  53. <HcPages :pages="searchForm" @change="pageChange" />
  54. </template>
  55. </HcNewCard>
  56. <!-- 新增/编辑 -->
  57. <HcDialog
  58. :is-close="false" :loading="addEditFormLoading" :show="addEditFormModal"
  59. :title="`${addEditFormModel.id ? '编辑' : '新增'}人员档案`" widths="70rem" @close="addEditFormModalClose"
  60. @save="addEditFormClick"
  61. >
  62. <template #extra>
  63. <HcNewSwitch :datas="tabTypeTab" :keys="tabTypeKey" @change="tabTypeChange" />
  64. </template>
  65. <el-form
  66. ref="addEditFormRef" :model="addEditFormModel" :rules="addEditFormRules" label-width="auto"
  67. size="large"
  68. >
  69. <template v-if="tabTypeKey === 'tab1'">
  70. <div class="hc-form-item">
  71. <el-form-item label="姓名" prop="name">
  72. <el-input v-model="addEditFormModel.name" />
  73. </el-form-item>
  74. <el-form-item label="身份证" prop="idCard">
  75. <el-input v-model="addEditFormModel.idCard" />
  76. </el-form-item>
  77. <el-form-item label="出生日期" prop="birthday">
  78. <el-date-picker
  79. v-model="addEditFormModel.birthday" :clearable="false" class="block"
  80. type="date" value-format="YYYY-MM-DD"
  81. />
  82. </el-form-item>
  83. </div>
  84. <div class="hc-form-item">
  85. <el-form-item label="性别">
  86. <el-select v-model="addEditFormModel.sex" block>
  87. <el-option :value="1" label="男" />
  88. <el-option :value="2" label="女" />
  89. </el-select>
  90. </el-form-item>
  91. <el-form-item label="毕业院校">
  92. <el-input v-model="addEditFormModel.graduationSchool" />
  93. </el-form-item>
  94. <el-form-item label="专业">
  95. <el-input v-model="addEditFormModel.major" />
  96. </el-form-item>
  97. </div>
  98. <div class="hc-form-item">
  99. <el-form-item label="学历">
  100. <el-select v-model="addEditFormModel.education" block>
  101. <el-option
  102. v-for="item in educationData" :label="item.dictValue"
  103. :value="item.dictKey"
  104. />
  105. </el-select>
  106. </el-form-item>
  107. <el-form-item label="毕业日期">
  108. <el-date-picker
  109. v-model="addEditFormModel.graduationDate" :clearable="false" class="block"
  110. type="date" value-format="YYYY-MM-DD"
  111. />
  112. </el-form-item>
  113. <el-form-item label="入职时间">
  114. <el-date-picker
  115. v-model="addEditFormModel.entryTime" :clearable="false" class="block"
  116. type="date" value-format="YYYY-MM-DD"
  117. />
  118. </el-form-item>
  119. </div>
  120. <div class="hc-form-item">
  121. <el-form-item label="就职状态">
  122. <el-select v-model="addEditFormModel.status" block>
  123. <el-option :value="1" label="在职" />
  124. <el-option :value="0" label="离职" />
  125. </el-select>
  126. </el-form-item>
  127. <el-form-item label="职称">
  128. <el-input v-model="addEditFormModel.jobTitleName" />
  129. </el-form-item>
  130. <el-form-item label="工作职务">
  131. <el-input v-model="addEditFormModel.jobTitlePost" />
  132. </el-form-item>
  133. </div>
  134. <div class="hc-form-item">
  135. <el-form-item label="进场时间">
  136. <el-date-picker
  137. v-model="addEditFormModel.mobilizationTime" :clearable="false" class="block"
  138. type="date" value-format="YYYY-MM-DD"
  139. />
  140. </el-form-item>
  141. <el-form-item label="部门">
  142. <el-input v-model="addEditFormModel.department" />
  143. </el-form-item>
  144. <el-form-item label="从事检测工作时间(月)">
  145. <el-input v-model="addEditFormModel.workingTime" />
  146. </el-form-item>
  147. </div>
  148. <div class="hc-form-item">
  149. <el-form-item label="退场时间">
  150. <el-date-picker
  151. v-model="addEditFormModel.exitTime" :clearable="false" class="block"
  152. type="date" value-format="YYYY-MM-DD"
  153. />
  154. </el-form-item>
  155. <el-form-item label="劳动合同开始日期">
  156. <el-date-picker
  157. v-model="addEditFormModel.laborContractStartDate" :clearable="false" class="block"
  158. type="date" value-format="YYYY-MM-DD"
  159. />
  160. </el-form-item>
  161. <el-form-item label="劳动合同终止日期">
  162. <el-date-picker
  163. v-model="addEditFormModel.laborContractEndDate" :clearable="false" class="block"
  164. type="date" value-format="YYYY-MM-DD"
  165. />
  166. </el-form-item>
  167. </div>
  168. </template>
  169. <template v-if="tabTypeKey === 'tab2'">
  170. <el-form-item label="证书编号">
  171. <el-input v-model="addEditFormModel.certificateNo" />
  172. </el-form-item>
  173. <el-form-item label="持证类型">
  174. <el-select v-model="addEditFormModel.certificateType" block>
  175. <el-option label="检测员" value="1" />
  176. <el-option label="检测工程师" value="2" />
  177. </el-select>
  178. </el-form-item>
  179. <el-form-item label="持证专业">
  180. <el-select v-model="addEditFormModel.certificateMajor" block>
  181. <el-option label="水运结构与地基" value="1" />
  182. <el-option label="交通工具" value="2" />
  183. <el-option label="水运材料" value="3" />
  184. <el-option label="桥梁隧道工程" value="4" />
  185. <el-option label="道路工程" value="5" />
  186. </el-select>
  187. </el-form-item>
  188. <el-form-item label="证书文件">
  189. <FormItemUpload v-model="addEditFormModel.certificateUrl" />
  190. </el-form-item>
  191. </template>
  192. <template v-if="tabTypeKey === 'tab3'">
  193. <el-form-item label="记录日期">
  194. <el-date-picker
  195. v-model="addEditFormModel.workRecordDate" :clearable="false" class="block"
  196. type="date" value-format="YYYY-MM-DD"
  197. />
  198. </el-form-item>
  199. <el-form-item label="内容">
  200. <el-input v-model="addEditFormModel.workContent" :autosize="{ minRows: 8 }" type="textarea" />
  201. </el-form-item>
  202. </template>
  203. </el-form>
  204. </HcDialog>
  205. </div>
  206. </template>
  207. <script setup>
  208. import { onMounted, ref } from 'vue'
  209. import { useAppStore } from '~src/store'
  210. import dataApi from '~api/tentative/laboratory/user'
  211. import FormItemUpload from './components/FormItemUpload.vue'
  212. import { arrKeyValue, arrToId, formValidate, getArrValue, isIdCard } from 'js-fast-way'
  213. import { getDictionary } from '~api/other'
  214. import { delMessageV2 } from '~com/message/index.js'
  215. //初始变量
  216. const useAppState = useAppStore()
  217. //全局变量
  218. const projectId = ref(useAppState.getProjectId)
  219. const contractId = ref(useAppState.getContractId)
  220. //渲染完成
  221. onMounted(() => {
  222. getTableData()
  223. getEducationType()
  224. })
  225. //获取学历类型
  226. const educationData = ref([])
  227. const getEducationType = async () => {
  228. const { data } = await getDictionary({
  229. code: 'trial_user_education',
  230. })
  231. const arrData = getArrValue(data)
  232. arrData.forEach(item => {
  233. item.dictKey = Number(item.dictKey)
  234. })
  235. educationData.value = arrData
  236. }
  237. //持证类型、持证专业
  238. //搜索表单
  239. const searchForm = ref({
  240. queryValue: null, current: 1, size: 20, total: 0,
  241. })
  242. //回车搜索
  243. const keyUpEvent = (e) => {
  244. if (e.key === 'Enter') {
  245. searchForm.value.current = 1
  246. getTableData()
  247. }
  248. }
  249. //搜索
  250. const searchClick = () => {
  251. searchForm.value.current = 1
  252. getTableData()
  253. }
  254. //分页被点击
  255. const pageChange = ({ current, size }) => {
  256. searchForm.value.current = current
  257. searchForm.value.size = size
  258. getTableData()
  259. }
  260. //表格数据
  261. const tableRef = ref(null)
  262. const tableColumn = ref([
  263. { key: 'name', name: '姓名', width: 100 },
  264. { key: 'department', name: '部门', width: 120 },
  265. { key: 'jobTitleName', name: '职称', width: 100 },
  266. { key: 'status', name: '就职状态', width: 80 },
  267. { key: 'entryTime', name: '入职时间', width: 140 },
  268. { key: 'workingTime', name: '从事检测工作(月)', width: 150 },
  269. { key: 'jobTitlePost', name: '工作职务', width: 120 },
  270. { key: 'idCard', name: '身份证号码', width: 180 },
  271. { key: 'birthday', name: '出生日期', width: 140 },
  272. { key: 'sex', name: '性别', width: 80 },
  273. { key: 'graduationSchool', name: '毕业院校' },
  274. { key: 'education', name: '学历', width: 120 },
  275. { key: 'major', name: '专业', width: 150 },
  276. { key: 'graduationDate', name: '毕业时间', width: 140 },
  277. { key: 'laborContractEndDate', name: '劳动合同终止日期', width: 140 },
  278. { key: 'mobilizationTime', name: '进场时间', width: 140 },
  279. { key: 'exitTime', name: '退场时间', width: 140 },
  280. ])
  281. //获取数据
  282. const tableLoading = ref(false)
  283. const tableData = ref([])
  284. const getTableData = async () => {
  285. tableLoading.value = true
  286. const { error, code, data } = await dataApi.queryPage({
  287. projectId: projectId.value,
  288. contractId: contractId.value,
  289. ...searchForm.value,
  290. })
  291. //处理数据
  292. tableLoading.value = false
  293. if (!error && code === 200) {
  294. tableData.value = getArrValue(data['records'])
  295. tableData.value.forEach((item) => {
  296. if (item?.workingTime == -1) {
  297. item.workingTime = ''
  298. }
  299. })
  300. searchForm.value.total = data.total || 0
  301. } else {
  302. tableData.value = []
  303. searchForm.value.total = 0
  304. }
  305. }
  306. //多选
  307. const tableCheckedKeys = ref([])
  308. const tableSelection = (rows) => {
  309. tableCheckedKeys.value = rows
  310. }
  311. //新增表单
  312. const addEditFormModal = ref(false)
  313. const addFormModalClick = () => {
  314. addEditFormModel.value = {
  315. status: 1, sex: 1, certificateType: '1', certificateMajor: '1', education: 1,
  316. }
  317. addEditFormModal.value = true
  318. }
  319. //编辑表单
  320. const editFormModalClick = () => {
  321. const keys = tableCheckedKeys.value
  322. if (keys.length === 1) {
  323. addEditFormModel.value = keys[0]
  324. addEditFormModel.value.certificateType = addEditFormModel.value.certificateType + ''
  325. addEditFormModel.value.certificateMajor = addEditFormModel.value.certificateMajor + ''
  326. addEditFormModal.value = true
  327. } else if (keys.length > 1) {
  328. window?.$message?.warning('只能选择一条数据编辑')
  329. }
  330. }
  331. //关闭表单
  332. const addEditFormModalClose = () => {
  333. addEditFormModal.value = false
  334. addEditFormModel.value = {}
  335. }
  336. //类型tab数据和相关处理
  337. const tabTypeKey = ref('tab1')
  338. const tabTypeTab = ref([
  339. { key: 'tab1', name: '基本信息' },
  340. { key: 'tab2', name: '证书信息' },
  341. { key: 'tab3', name: '工作记录' },
  342. ])
  343. const tabTypeChange = (item) => {
  344. tabTypeKey.value = item?.key
  345. }
  346. //新增/编辑 表单
  347. const addEditFormRef = ref(null)
  348. const addEditFormModel = ref({})
  349. const addEditFormRules = {
  350. name: {
  351. required: true,
  352. trigger: 'blur',
  353. validator: (rule, value, callback) => {
  354. if (!value) {
  355. callback(new Error('请输入姓名'))
  356. } else if (value.length > 5 || value.length < 2) {
  357. callback(new Error('姓名长度必须大于等于2并且小于等于5'))
  358. } else {
  359. callback()
  360. }
  361. },
  362. },
  363. idCard: {
  364. required: true,
  365. validator: (rule, value, callback) => {
  366. if (!value) {
  367. callback(new Error('请输入身份证号码'))
  368. } else if (!isIdCard(value)) {
  369. callback(new Error('身份证号码格式错误'))
  370. } else {
  371. callback()
  372. }
  373. },
  374. trigger: 'blur',
  375. },
  376. birthday: {
  377. required: true,
  378. trigger: 'blur',
  379. message: '请选择出生日期',
  380. },
  381. }
  382. //新增/编辑 保存
  383. const addEditFormLoading = ref(false)
  384. const addEditFormClick = async () => {
  385. const validate = await formValidate(addEditFormRef.value)
  386. if (validate) {
  387. addEditFormLoading.value = true
  388. addEditFormModel.value.workingTime = Number(addEditFormModel.value.workingTime)
  389. const { error, code } = await dataApi.submitForm({
  390. ...addEditFormModel.value,
  391. projectId: projectId.value,
  392. contractId: contractId.value,
  393. })
  394. //处理数据
  395. if (!error && code === 200) {
  396. window?.$message?.success('操作成功')
  397. addEditFormModal.value = false
  398. addEditFormLoading.value = false
  399. await getTableData()
  400. }
  401. addEditFormModal.value = false
  402. addEditFormLoading.value = false
  403. }
  404. }
  405. //删除
  406. const delModalClick = () => {
  407. delMessageV2(async (action, instance, done) => {
  408. if (action === 'confirm') {
  409. instance.confirmButtonLoading = true
  410. tableRemoveData()
  411. instance.confirmButtonLoading = false
  412. done()
  413. } else {
  414. done()
  415. }
  416. })
  417. }
  418. //批量删除
  419. const tableRemoveData = async () => {
  420. const rows = tableCheckedKeys.value
  421. if (rows.length > 0) {
  422. const ids = arrToId(rows)
  423. //删除请求
  424. const { error, code } = await dataApi.removeData({
  425. projectId: projectId.value,
  426. contractId: contractId.value,
  427. ids: ids,
  428. })
  429. //处理数据
  430. if (!error && code === 200) {
  431. window?.$message?.success('操作成功')
  432. searchClick()
  433. }
  434. }
  435. }
  436. </script>
  437. <style lang="scss" scoped>
  438. </style>