综合办公系统
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. <template>
  2. <view class="container">
  3. <uv-form ref="form" :model="form" :rules="rules" label-width="200rpx">
  4. <!-- 基本信息 -->
  5. <view class="form-section">
  6. <view class="section-title">基本信息</view>
  7. <view class="form-item">
  8. <uv-form-item label="姓名" prop="nickName">
  9. <uv-input v-model="form.nickName" placeholder="请输入姓名" />
  10. </uv-form-item>
  11. </view>
  12. <view class="form-item">
  13. <uv-form-item label="性别">
  14. <uv-radio-group v-model="form.sex">
  15. <uv-radio label="0">男</uv-radio>
  16. <uv-radio label="1">女</uv-radio>
  17. </uv-radio-group>
  18. </uv-form-item>
  19. </view>
  20. <view class="form-item">
  21. <uv-form-item label="手机号码" prop="phonenumber">
  22. <uv-input v-model="form.phonenumber" placeholder="请输入手机号码" />
  23. </uv-form-item>
  24. </view>
  25. <view class="form-item">
  26. <uv-form-item label="身份证" prop="idCard">
  27. <uv-input v-model="form.idCard" placeholder="请输入身份证号码" />
  28. </uv-form-item>
  29. </view>
  30. <view class="form-item">
  31. <uv-form-item label="籍贯">
  32. <uv-input v-model="form.nativePlace" placeholder="请输入籍贯" />
  33. </uv-form-item>
  34. </view>
  35. <view class="form-item">
  36. <uv-form-item label="民族">
  37. <uv-input v-model="form.ethnic" placeholder="请输入民族" />
  38. </uv-form-item>
  39. </view>
  40. <view class="form-item">
  41. <uv-form-item label="政治面貌">
  42. <uv-select v-model="form.politicalAffiliation" :options="politicalOptions" placeholder="请选择政治面貌" multiple />
  43. </uv-form-item>
  44. </view>
  45. </view>
  46. <!-- 工作信息 -->
  47. <view class="form-section">
  48. <view class="section-title">工作信息</view>
  49. <view class="form-item">
  50. <uv-form-item label="归属部门" prop="deptId">
  51. <uv-select v-model="form.deptId" :options="deptOptions" placeholder="请选择归属部门" />
  52. </uv-form-item>
  53. </view>
  54. <view class="form-item">
  55. <uv-form-item label="入职时间">
  56. <uv-datetime-picker v-model="form.entryDate" mode="date" placeholder="请选择入职时间" />
  57. </uv-form-item>
  58. </view>
  59. <view class="form-item">
  60. <uv-form-item label="合同签订">
  61. <uv-datetime-picker v-model="form.contractSign" mode="date" placeholder="请选择合同签订时间" />
  62. </uv-form-item>
  63. </view>
  64. <view class="form-item">
  65. <uv-form-item label="合同期满">
  66. <uv-datetime-picker v-model="form.contractExpire" mode="date" placeholder="请选择合同期满时间" />
  67. </uv-form-item>
  68. </view>
  69. <view class="form-item">
  70. <uv-form-item label="技术职称">
  71. <uv-select v-model="form.titles" :options="titleOptions" placeholder="请选择技术职称" />
  72. </uv-form-item>
  73. </view>
  74. <view class="form-item">
  75. <uv-form-item label="职称专业">
  76. <uv-input v-model="form.titleProfession" placeholder="请输入职称专业" />
  77. </uv-form-item>
  78. </view>
  79. <view class="form-item">
  80. <uv-form-item label="职业资格">
  81. <uv-select v-model="form.certificates" :options="certificateOptions" placeholder="请选择职业资格" multiple />
  82. </uv-form-item>
  83. </view>
  84. <view class="form-item">
  85. <uv-form-item label="岗级">
  86. <view class="level-group">
  87. <uv-select v-model="form.postLevel" :options="postLevelOptions" placeholder="请选择岗级" />
  88. <uv-select v-model="form.salaryLevel" :options="salaryLevelOptions" placeholder="请选择薪级" />
  89. </view>
  90. </uv-form-item>
  91. </view>
  92. <view class="form-item">
  93. <uv-form-item label="状态">
  94. <uv-radio-group v-model="form.status">
  95. <uv-radio label="0">在职</uv-radio>
  96. <uv-radio label="1">离职</uv-radio>
  97. <uv-radio label="2">退休</uv-radio>
  98. <uv-radio label="3">试用</uv-radio>
  99. <uv-radio label="4">返聘</uv-radio>
  100. </uv-radio-group>
  101. </uv-form-item>
  102. </view>
  103. </view>
  104. <!-- 教育背景 -->
  105. <view class="form-section">
  106. <view class="section-title">教育背景</view>
  107. <view class="form-item">
  108. <uv-form-item label="最高学历">
  109. <uv-select v-model="form.degree" :options="degreeOptions" placeholder="请选择最高学历" />
  110. </uv-form-item>
  111. </view>
  112. <view class="form-item">
  113. <uv-form-item label="最高学历专业">
  114. <uv-input v-model="form.major" placeholder="请输入最高学历专业" />
  115. </uv-form-item>
  116. </view>
  117. <view class="form-item">
  118. <uv-form-item label="最高学历毕业学校">
  119. <uv-input v-model="form.graduateSchool" placeholder="请输入最高学历毕业学校" />
  120. </uv-form-item>
  121. </view>
  122. <view class="form-item">
  123. <uv-form-item label="初始学历">
  124. <uv-select v-model="form.initialDegree" :options="degreeOptions" placeholder="请选择初始学历" />
  125. </uv-form-item>
  126. </view>
  127. <view class="form-item">
  128. <uv-form-item label="初始学历专业">
  129. <uv-input v-model="form.initialMajor" placeholder="请输入初始学历专业" />
  130. </uv-form-item>
  131. </view>
  132. <view class="form-item">
  133. <uv-form-item label="初始学历毕业学校">
  134. <uv-input v-model="form.initialSchool" placeholder="请输入初始学历毕业学校" />
  135. </uv-form-item>
  136. </view>
  137. </view>
  138. <!-- 其他信息 -->
  139. <view class="form-section">
  140. <view class="section-title">其他信息</view>
  141. <view class="form-item">
  142. <uv-form-item label="家庭住址">
  143. <uv-textarea v-model="form.homePlace" placeholder="请输入家庭住址" />
  144. </uv-form-item>
  145. </view>
  146. <view class="form-item">
  147. <uv-form-item label="紧急联系人">
  148. <uv-input v-model="form.contact" placeholder="请输入紧急联系人" />
  149. </uv-form-item>
  150. </view>
  151. <view class="form-item">
  152. <uv-form-item label="紧急联系电话">
  153. <uv-input v-model="form.telephone" placeholder="请输入紧急联系电话" />
  154. </uv-form-item>
  155. </view>
  156. <view class="form-item">
  157. <uv-form-item label="备注">
  158. <uv-textarea v-model="form.remark" placeholder="请输入备注信息" />
  159. </uv-form-item>
  160. </view>
  161. </view>
  162. </uv-form>
  163. <!-- 操作按钮 -->
  164. <view class="action-section">
  165. <uv-button type="default" @click="handleCancel">取消</uv-button>
  166. <uv-button type="primary" @click="handleSubmit">保存</uv-button>
  167. </view>
  168. </view>
  169. </template>
  170. <script>
  171. import { getUser, updateUser, addUser } from "@/api/system/user";
  172. import { deptTreeSelectNew } from "@/api/system/dept";
  173. export default {
  174. data() {
  175. return {
  176. form: {
  177. userId: undefined,
  178. nickName: '',
  179. sex: '0',
  180. phonenumber: '',
  181. idCard: '',
  182. nativePlace: '',
  183. ethnic: '',
  184. politicalAffiliation: [],
  185. deptId: undefined,
  186. entryDate: '',
  187. contractSign: '',
  188. contractExpire: '',
  189. titles: '',
  190. titleProfession: '',
  191. certificates: [],
  192. postLevel: '',
  193. salaryLevel: '',
  194. status: '0',
  195. degree: '',
  196. major: '',
  197. graduateSchool: '',
  198. initialDegree: '',
  199. initialMajor: '',
  200. initialSchool: '',
  201. homePlace: '',
  202. contact: '',
  203. telephone: '',
  204. remark: ''
  205. },
  206. deptOptions: [],
  207. politicalOptions: [
  208. { label: '中共党员', value: '1' },
  209. { label: '中共预备党员', value: '2' },
  210. { label: '共青团员', value: '3' },
  211. { label: '民革党员', value: '4' },
  212. { label: '民盟盟员', value: '5' },
  213. { label: '民建会员', value: '6' },
  214. { label: '民进会员', value: '7' },
  215. { label: '农工党党员', value: '8' },
  216. { label: '致公党党员', value: '9' },
  217. { label: '九三学社社员', value: '10' },
  218. { label: '台盟盟员', value: '11' },
  219. { label: '无党派人士', value: '12' },
  220. { label: '群众', value: '13' }
  221. ],
  222. titleOptions: [
  223. { label: '高级工程师', value: '1' },
  224. { label: '工程师', value: '2' },
  225. { label: '助理工程师', value: '3' },
  226. { label: '技术员', value: '4' }
  227. ],
  228. certificateOptions: [
  229. { label: '注册测绘师', value: '1' },
  230. { label: '注册建筑师', value: '2' },
  231. { label: '注册结构师', value: '3' },
  232. { label: '注册造价师', value: '4' }
  233. ],
  234. degreeOptions: [
  235. { label: '博士', value: '1' },
  236. { label: '硕士', value: '2' },
  237. { label: '本科', value: '3' },
  238. { label: '专科', value: '4' },
  239. { label: '高中', value: '5' }
  240. ],
  241. postLevelOptions: [
  242. { label: '一级', value: '1' },
  243. { label: '二级', value: '2' },
  244. { label: '三级', value: '3' },
  245. { label: '四级', value: '4' },
  246. { label: '五级', value: '5' }
  247. ],
  248. salaryLevelOptions: [
  249. { label: 'A', value: '1' },
  250. { label: 'B', value: '2' },
  251. { label: 'C', value: '3' },
  252. { label: 'D', value: '4' },
  253. { label: 'E', value: '5' }
  254. ],
  255. rules: {
  256. nickName: [
  257. { required: true, message: '请输入姓名', trigger: 'blur' }
  258. ],
  259. phonenumber: [
  260. { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, message: '请输入正确的手机号码', trigger: 'blur' }
  261. ],
  262. idCard: [
  263. { pattern: /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/, message: '请输入正确的身份证号码', trigger: 'blur' }
  264. ],
  265. deptId: [
  266. { required: true, message: '请选择归属部门', trigger: 'change' }
  267. ]
  268. }
  269. }
  270. },
  271. onLoad(options) {
  272. this.getDeptTree();
  273. if (options.userId) {
  274. this.getStaffInfo(options.userId);
  275. }
  276. },
  277. methods: {
  278. // 获取部门树
  279. async getDeptTree() {
  280. try {
  281. const res = await deptTreeSelectNew();
  282. this.deptOptions = res.data || [];
  283. } catch (error) {
  284. console.error('获取部门树失败:', error);
  285. }
  286. },
  287. // 获取员工信息
  288. async getStaffInfo(userId) {
  289. try {
  290. const res = await getUser(userId);
  291. this.form = { ...this.form, ...res.data };
  292. // 处理政治面貌数组
  293. if (this.form.politicalAffiliation) {
  294. this.form.politicalAffiliation = this.form.politicalAffiliation.split(',');
  295. }
  296. // 处理职业资格数组
  297. if (this.form.certificates) {
  298. this.form.certificates = this.form.certificates.split(',');
  299. }
  300. } catch (error) {
  301. console.error('获取员工信息失败:', error);
  302. uni.showToast({
  303. title: '获取员工信息失败',
  304. icon: 'none'
  305. });
  306. }
  307. },
  308. // 提交表单
  309. handleSubmit() {
  310. this.$refs.form.validate(async (valid) => {
  311. if (valid) {
  312. try {
  313. // 处理数组字段
  314. const submitData = { ...this.form };
  315. submitData.politicalAffiliation = this.form.politicalAffiliation.join(',');
  316. submitData.certificates = this.form.certificates.join(',');
  317. if (this.form.userId) {
  318. // 更新
  319. await updateUser(submitData);
  320. uni.showToast({
  321. title: '更新成功',
  322. icon: 'success'
  323. });
  324. } else {
  325. // 新增
  326. await addUser(submitData);
  327. uni.showToast({
  328. title: '添加成功',
  329. icon: 'success'
  330. });
  331. }
  332. // 返回上一页
  333. setTimeout(() => {
  334. uni.navigateBack();
  335. }, 1500);
  336. } catch (error) {
  337. console.error('保存失败:', error);
  338. uni.showToast({
  339. title: '保存失败',
  340. icon: 'none'
  341. });
  342. }
  343. }
  344. });
  345. },
  346. // 取消
  347. handleCancel() {
  348. uni.navigateBack();
  349. }
  350. }
  351. }
  352. </script>
  353. <style lang="scss" scoped>
  354. .container {
  355. background-color: #f5f5f5;
  356. min-height: 100vh;
  357. padding-bottom: 120rpx;
  358. }
  359. .form-section {
  360. background-color: #fff;
  361. margin-bottom: 20rpx;
  362. padding: 30rpx;
  363. .section-title {
  364. font-size: 32rpx;
  365. font-weight: bold;
  366. color: #333;
  367. margin-bottom: 30rpx;
  368. border-left: 6rpx solid #007aff;
  369. padding-left: 20rpx;
  370. }
  371. .form-item {
  372. margin-bottom: 30rpx;
  373. }
  374. .level-group {
  375. display: flex;
  376. gap: 20rpx;
  377. .uv-select {
  378. flex: 1;
  379. }
  380. }
  381. }
  382. .action-section {
  383. position: fixed;
  384. bottom: 0;
  385. left: 0;
  386. right: 0;
  387. background-color: #fff;
  388. padding: 20rpx 30rpx;
  389. border-top: 1rpx solid #eee;
  390. display: flex;
  391. gap: 20rpx;
  392. .uv-button {
  393. flex: 1;
  394. }
  395. }
  396. </style>