index.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443
  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
  4. <el-form-item label="护工姓名" prop="name">
  5. <el-input v-model="queryParams.name" placeholder="请输入护工姓名" maxlength="20" clearable size="small" @keyup.enter.native="handleQuery" />
  6. </el-form-item>
  7. <el-form-item label="手机号" prop="phoneNumber">
  8. <el-input v-model="queryParams.phoneNumber" placeholder="请输入手机号" maxlength="11" clearable size="small" @keyup.enter.native="handleQuery" />
  9. </el-form-item>
  10. <el-form-item label="性别" prop="sex">
  11. <el-select v-model="queryParams.sex" placeholder="请选择性别" clearable size="small" style="width: 240px">
  12. <el-option label="男" value="1" />
  13. <el-option label="女" value="2" />
  14. </el-select>
  15. </el-form-item>
  16. <el-form-item label="创建时间">
  17. <el-date-picker v-model="daterangeCreateTime" size="small" style="width: 240px" value-format="yyyy-MM-dd" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
  18. </el-form-item>
  19. <el-form-item label="用户状态" prop="enableStatus">
  20. <el-select v-model="queryParams.enableStatus" placeholder="请选择用户状态" clearable size="small" style="width: 240px">
  21. <el-option label="启用" value="0" />
  22. <el-option label="禁用" value="1" />
  23. </el-select>
  24. </el-form-item>
  25. <el-form-item label="接单状态" prop="orderReceivingStatus">
  26. <el-select v-model="queryParams.orderReceivingStatus" placeholder="请选择接单状态" clearable size="small" style="width: 240px">
  27. <el-option label="正常" value="0" />
  28. <el-option label="关闭" value="1" />
  29. </el-select>
  30. </el-form-item>
  31. <el-form-item label="常驻医院" prop="hospitalId">
  32. <el-select v-model="queryParams.hospitalId" placeholder="请选择常驻医院" clearable size="small" style="width: 240px">
  33. <el-option v-for="(v,i) in hospitalList" :key="i" :label="v.name" :value="v.id" />
  34. </el-select>
  35. </el-form-item>
  36. <el-form-item>
  37. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  38. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  39. </el-form-item>
  40. </el-form>
  41. <el-row :gutter="10" class="mb8">
  42. <el-col :span="1.5">
  43. <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd">新增</el-button>
  44. </el-col>
  45. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  46. </el-row>
  47. <el-table v-loading="loading" :data="list">
  48. <el-table-column type="index" width="55" label="序号" align="center">
  49. <template slot-scope="scope">
  50. <div>
  51. {{ (queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1 }}
  52. </div>
  53. </template>
  54. </el-table-column>
  55. <el-table-column label="姓名" align="center" prop="name" />
  56. <el-table-column label="形象照片" align="center" prop="photographUrl">
  57. <template slot-scope="scope">
  58. <el-image style="width: 50px; height: 50px" :src="scope.row.photographUrl" :preview-src-list="scope.row.photographUrl ? [scope.row.photographUrl] : []"></el-image>
  59. </template>
  60. </el-table-column>
  61. <el-table-column label="性别" align="center" prop="sex" width="80">
  62. <template slot-scope="{row}">
  63. {{row.sex==1?'男':row.sex==2?'女':'未知'}}
  64. </template>
  65. </el-table-column>
  66. <el-table-column label="年龄" align="center" prop="age" width="80" />
  67. <el-table-column label="工作年限" align="center" prop="workYears" width="80" />
  68. <el-table-column label="手机号" align="center" prop="phoneNumber" />
  69. <el-table-column label="常驻医院" align="center" prop="hospitalName" />
  70. <el-table-column label="接单数量" align="center" prop="orderCount" width="80" />
  71. <el-table-column label="接单状态" align="center" prop="locationCodeText">
  72. <template slot-scope="{row}">
  73. <el-tag v-if="row.orderReceivingStatus==0">正常</el-tag>
  74. <el-tag v-if="row.orderReceivingStatus==1" type="danger">关闭</el-tag>
  75. </template>
  76. </el-table-column>
  77. <el-table-column label="用户状态" align="center" prop="enableStatus">
  78. <template slot-scope="{row}">
  79. <el-tag v-if="row.enableStatus==0">启用</el-tag>
  80. <el-tag v-if="row.enableStatus==1" type="danger">禁用</el-tag>
  81. </template>
  82. </el-table-column>
  83. <el-table-column label="创建时间" align="center" prop="createTime" width="180">
  84. <template slot-scope="scope">
  85. <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}') }}</span>
  86. </template>
  87. </el-table-column>
  88. <el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
  89. <template slot-scope="scope">
  90. <el-button size="mini" type="text" @click="handleUpdate(scope.row,'查看')">查看</el-button>
  91. <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row,'修改')">修改</el-button>
  92. <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)">删除</el-button>
  93. <el-button size="mini" type="text" @click="setStatus(scope.row)">{{scope.row.enableStatus=='1'?'启用':'禁用'}}</el-button>
  94. </template>
  95. </el-table-column>
  96. </el-table>
  97. <pagination v-show="total>0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" @pagination="getList" />
  98. <!-- 添加或修改对话框 -->
  99. <el-drawer :title="title" :visible.sync="open" width="500px" append-to-body>
  100. <el-form ref="form" :model="form" :rules="rules" label-width="120px" :disabled="title=='查看'">
  101. <el-form-item label="护工姓名" prop="name">
  102. <el-input v-model="form.name" placeholder="请输入" />
  103. </el-form-item>
  104. <el-form-item label="形象照片" prop="photographUrl">
  105. <imageUpload key="photographUrl" :disabled="title=='查看'" v-model="form.photographUrl" :unique="'photograph-' + form.id" :limit="1" />
  106. </el-form-item>
  107. <el-form-item label="性别" prop="sex">
  108. <el-select v-model="form.sex" placeholder="请选择" clearable size="small">
  109. <el-option label="男" value="1" />
  110. <el-option label="女" value="2" />
  111. </el-select>
  112. </el-form-item>
  113. <el-form-item label="身份证" prop="idCard">
  114. <el-input v-model="form.idCard" maxlength="18" placeholder="请输入" @blur="getAge(form.idCard)" />
  115. </el-form-item>
  116. <el-form-item label="年龄" prop="age">
  117. <el-input v-model="form.age" placeholder="请输入" maxlength="3" oninput="value=value.replace(/[^0-9]/g,'')" />
  118. </el-form-item>
  119. <el-form-item label="工作年限" prop="workYears">
  120. <el-input v-model="form.workYears" placeholder="请输入" maxlength="2" oninput="value=value.replace(/[^0-9]/g,'')" />
  121. </el-form-item>
  122. <el-form-item label="手机号" prop="phoneNumber">
  123. <el-input v-model="form.phoneNumber" maxlength="11" placeholder="请输入" />
  124. </el-form-item>
  125. <el-form-item label="从业证书" prop="nursingCertificateList">
  126. <div class="box" v-for="(item, index) in form.nursingCertificateList" :key="index">
  127. <div class="box_t" v-if="title!='查看'">
  128. <el-input v-model="item.certificateName" maxlength="11" style="margin-right:10px" placeholder="请输入" />
  129. <el-button type="primary" @click="add">新增</el-button>
  130. <el-button type="danger" v-if="index>0" @click="del(index)">删除</el-button>
  131. </div>
  132. <imageUpload :key="'certificate-' + index" :disabled="title=='查看'" v-model="item.pictureUrl" :unique="'certificate-' + index" :limit="1" />
  133. </div>
  134. </el-form-item>
  135. <el-form-item label="排序" prop="sortOrder">
  136. <el-input-number v-model="form.sortOrder" :min="1" label="排序" :precision="0"></el-input-number>
  137. </el-form-item>
  138. <el-form-item label="接单状态" prop="orderReceivingStatus">
  139. <el-select v-model="form.orderReceivingStatus" placeholder="请选择" clearable style="width: 100%">
  140. <el-option label="正常" value="0" />
  141. <el-option label="关闭" value="1" />
  142. </el-select>
  143. </el-form-item>
  144. <el-form-item label="常驻医院" prop="hospitalId">
  145. <el-select v-model="form.hospitalId" placeholder="请选择" clearable style="width: 100%">
  146. <el-option v-for="(v,i) in hospitalList" :key="i" :label="v.name" :value="v.id" />
  147. </el-select>
  148. </el-form-item>
  149. </el-form>
  150. <div class="demo-drawer__footer">
  151. <el-button v-if="title!='查看'" :loading="buttonLoading" type="primary" @click="submitForm">确 定</el-button>
  152. <el-button @click="cancel">取 消</el-button>
  153. </div>
  154. </el-drawer>
  155. </div>
  156. </template>
  157. <script>
  158. import { nursingWorkerPage, nursingWorkerAdd, nursingWorkerInfo, nursingWorkerEdit, nursingWorkerDel, nursingWorkerUpdateStatus } from '@/api/caregiver.js'
  159. import { hospitalSimpleList } from '@/api/hospital.js'
  160. export default {
  161. data () {
  162. return {
  163. //按钮loading
  164. buttonLoading: false,
  165. // 遮罩层
  166. loading: false,
  167. // 选中数组
  168. ids: [],
  169. // 非单个禁用
  170. single: true,
  171. // 非多个禁用
  172. multiple: true,
  173. // 显示搜索条件
  174. showSearch: true,
  175. // 总条数
  176. total: 0,
  177. // 测试单表表格数据
  178. list: [],
  179. // 弹出层标题
  180. title: "",
  181. // 是否显示弹出层
  182. open: false,
  183. // 创建时间时间范围
  184. daterangeCreateTime: [],
  185. // 查询参数
  186. queryParams: {
  187. pageNum: 1,
  188. pageSize: 10,
  189. name: undefined,
  190. phoneNumber: undefined,
  191. sex: undefined,
  192. enableStatus: undefined,
  193. orderReceivingStatus: undefined,
  194. hospitalId: undefined,
  195. },
  196. form: {
  197. name: undefined,
  198. age: undefined,
  199. workYears: undefined,
  200. photographUrl: undefined,
  201. sex: undefined,
  202. idCard: undefined,
  203. phoneNumber: undefined,
  204. nursingCertificateList: [
  205. {
  206. id: undefined,
  207. pictureUrl: undefined,
  208. certificateName: undefined
  209. }
  210. ],
  211. sortOrder: 1,
  212. orderReceivingStatus: "0",
  213. enableStatus: "0",
  214. hospitalId: undefined
  215. },
  216. rules: {
  217. name: [
  218. { required: true, message: "请输入年龄护工姓名", trigger: "blur" }
  219. ],
  220. photographUrl: [
  221. { required: true, message: "请上传图片", trigger: "change" }
  222. ],
  223. sex: [
  224. { required: true, message: "请选择性别", trigger: "change" }
  225. ],
  226. idCard: [
  227. { required: true, message: "请输入身份证号码", trigger: "blur" }
  228. ],
  229. age: [
  230. { required: true, message: "请输入年龄", trigger: "blur" }
  231. ],
  232. workYears: [
  233. { required: true, message: "请输入工作年限", trigger: "blur" }
  234. ],
  235. phoneNumber: [
  236. { required: true, message: "请输入手机号", trigger: "blur" }
  237. ],
  238. orderReceivingStatus: [
  239. { required: true, message: "请选择接单状态", trigger: "change" }
  240. ],
  241. hospitalId: [
  242. { required: true, message: "请选择常驻医院", trigger: "change" }
  243. ]
  244. },
  245. hospitalList: []
  246. }
  247. },
  248. created () {
  249. this.getList();
  250. this.getHospitalList();
  251. },
  252. methods: {
  253. /** 搜索按钮操作 */
  254. handleQuery () {
  255. this.queryParams.pageNum = 1;
  256. this.getList();
  257. },
  258. getHospitalList () {
  259. hospitalSimpleList().then(response => {
  260. this.hospitalList = response.data;
  261. });
  262. },
  263. /** 查看/修改按钮操作 */
  264. handleUpdate (row, title) {
  265. this.loading = true;
  266. this.reset();
  267. const id = row.id || this.ids
  268. nursingWorkerInfo(id).then(response => {
  269. this.loading = false;
  270. this.form = response.data;
  271. this.open = true;
  272. this.title = title;
  273. });
  274. },
  275. /** 删除按钮操作 */
  276. handleDelete (row) {
  277. const ids = row.id || this.ids;
  278. this.$modal.confirm('是否确认删除护工姓名为"' + row.name + '"的数据项?').then(() => {
  279. this.loading = true;
  280. return nursingWorkerDel(ids);
  281. }).then(() => {
  282. this.loading = false;
  283. this.getList();
  284. this.$modal.msgSuccess("删除成功");
  285. }).finally(() => {
  286. this.loading = false;
  287. });
  288. },
  289. /** 用户状态操作 */
  290. setStatus (row) {
  291. let statusText = row.enableStatus == '1' ? '启用' : '禁用';
  292. this.$modal.confirm('是否确认' + statusText + '护工名字为"' + row.name + '"的数据项?').then(() => {
  293. this.loading = true;
  294. let param = { id: row.id, enableStatus: row.enableStatus == '1' ? '0' : '1' };
  295. return nursingWorkerUpdateStatus(param);
  296. }).then(() => {
  297. this.loading = false;
  298. this.getList();
  299. this.$modal.msgSuccess(statusText + "成功");
  300. }).finally(() => {
  301. this.loading = false;
  302. });
  303. },
  304. getAge (idCard) {
  305. if (!/^[1-9]\d{5}(18|19|20)\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])\d{3}[\dXx]$/.test(idCard)) {
  306. throw new Error("身份证号码格式不正确");
  307. }
  308. // 提取出生年月日:第7到14位是 YYYYMMDD
  309. const year = parseInt(idCard.substring(6, 10), 10);
  310. const month = parseInt(idCard.substring(10, 12), 10);
  311. const day = parseInt(idCard.substring(12, 14), 10);
  312. // 获取当前日期
  313. const today = new Date();
  314. const currentYear = today.getFullYear();
  315. const currentMonth = today.getMonth() + 1; // 月份从0开始
  316. const currentDay = today.getDate();
  317. // 计算年龄
  318. let age = currentYear - year;
  319. // 检查是否还没过生日
  320. if (currentMonth < month || (currentMonth === month && currentDay < day)) {
  321. age--;
  322. }
  323. this.form.age = age;
  324. },
  325. /** 重置按钮操作 */
  326. resetQuery () {
  327. this.daterangeCreateTime = [];
  328. this.resetForm("queryForm");
  329. this.handleQuery();
  330. },
  331. /** 新增按钮操作 */
  332. handleAdd () {
  333. this.reset();
  334. this.open = true;
  335. this.title = "添加护工";
  336. },
  337. // 表单重置
  338. reset () {
  339. this.form = {
  340. id: undefined,
  341. name: undefined,
  342. age: undefined,
  343. workYears: undefined,
  344. photographUrl: undefined,
  345. sex: undefined,
  346. idCard: undefined,
  347. phoneNumber: undefined,
  348. nursingCertificateList: [
  349. {
  350. pictureUrl: undefined,
  351. certificateName: undefined
  352. }
  353. ],
  354. sortOrder: 1,
  355. orderReceivingStatus: "0",
  356. enableStatus: "0",
  357. hospitalId: undefined
  358. };
  359. this.resetForm("form");
  360. },
  361. // 取消按钮
  362. cancel () {
  363. this.open = false;
  364. this.reset();
  365. },
  366. /** 提交按钮 */
  367. submitForm () {
  368. this.$refs["form"].validate(valid => {
  369. if (valid) {
  370. this.buttonLoading = true;
  371. if (this.form.id != null) {
  372. nursingWorkerEdit(this.form).then(response => {
  373. this.$modal.msgSuccess("修改成功");
  374. this.open = false;
  375. this.getList();
  376. }).finally(() => {
  377. this.buttonLoading = false;
  378. });
  379. } else {
  380. nursingWorkerAdd(this.form).then(response => {
  381. this.$modal.msgSuccess("新增成功");
  382. this.open = false;
  383. this.getList();
  384. }).finally(() => {
  385. this.buttonLoading = false;
  386. });
  387. }
  388. }
  389. });
  390. },
  391. getList () {
  392. this.loading = true;
  393. this.queryParams["createTimeStart"] = undefined;
  394. this.queryParams["createTimeEnd"] = undefined;
  395. if (null != this.daterangeCreateTime && '' != this.daterangeCreateTime) {
  396. this.queryParams["createTimeStart"] = this.daterangeCreateTime[0] + ' 00:00:00';
  397. this.queryParams["createTimeEnd"] = this.daterangeCreateTime[1] + ' 23:59:59';
  398. }
  399. nursingWorkerPage(this.queryParams).then(response => {
  400. this.list = response.rows;
  401. this.total = response.total;
  402. this.loading = false;
  403. });
  404. },
  405. add () {
  406. this.form.nursingCertificateList.push({
  407. id: this.generateId(),
  408. certificateName: '',
  409. pictureUrl: ''
  410. })
  411. },
  412. del (index) {
  413. this.form.nursingCertificateList.splice(index, 1)
  414. },
  415. },
  416. }
  417. </script>
  418. <style lang='scss' scoped>
  419. .flex {
  420. display: flex;
  421. }
  422. .demo-drawer__footer {
  423. margin-left: 120px;
  424. }
  425. ::v-deep .el-input.is-disabled .el-input__inner {
  426. background-color: #fff;
  427. color: rgb(96, 98, 102);
  428. }
  429. .box {
  430. .box_t {
  431. display: flex;
  432. margin-bottom: 10px;
  433. }
  434. }
  435. </style>