Нет описания

editDoctor.vue 10KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <template>
  2. <el-dialog
  3. class="dialogClass"
  4. title="医生管理"
  5. :visible.sync="dialogFormVisible"
  6. :close-on-click-modal="false"
  7. width="800px"
  8. @close="closeForm('formObj')"
  9. >
  10. <el-form
  11. :model="formObj"
  12. ref="formObj"
  13. :rules="rulesObj"
  14. label-width="80px"
  15. class="update-wrapper demo-ruleForm"
  16. v-loading="formLoading"
  17. >
  18. <el-row :gutter="25">
  19. <el-col :span="16">
  20. <el-row :gutter="20" class="update-main">
  21. <el-col :span="item.span||''" v-for="item in formItem" :key="item.index">
  22. <el-form-item v-if="item.prop" :label="item.tit" :prop="item.prop">
  23. <el-input
  24. v-if="item.textarea"
  25. type="textarea"
  26. :rows="8"
  27. v-model="formObj[item.prop]"
  28. :placeholder="`请填写${item.tit}`"
  29. :maxlength="item.num||''"
  30. ></el-input>
  31. <el-select v-else-if="item.select" v-model="formObj[item.prop]" placeholder="请选择">
  32. <el-option
  33. v-for="sel in item.select"
  34. :key="sel.value"
  35. :label="sel.label"
  36. :value="sel.value"
  37. @current-change="sel.value"
  38. ></el-option>
  39. </el-select>
  40. <el-select
  41. v-else-if="item.selectSearch"
  42. v-model="formObj[item.prop]"
  43. :placeholder="'请选择'+item.tit">
  44. <el-option
  45. v-for="sel in departList"
  46. :key="sel.id"
  47. :label="sel.name"
  48. :value="sel.id">
  49. </el-option>
  50. </el-select>
  51. <dynamicTags
  52. v-else-if="item.tag"
  53. :tagInfo="item.tag"
  54. :dyStr="dyStrArr"
  55. @turnTags="turnTags($event)"
  56. ></dynamicTags>
  57. <el-cascader
  58. v-else-if="item.cascader"
  59. :options="item.cascader"
  60. :props="{
  61. value: 'value',
  62. label: 'label',
  63. children: 'children'
  64. }"
  65. v-model="formObj[item.prop]"
  66. :placeholder="'请选择'+item.tit" @change="changeCascader">
  67. </el-cascader>
  68. <el-input
  69. v-else
  70. v-model="formObj[item.prop]"
  71. :placeholder="`请填写${item.tit}`"
  72. :maxlength="item.num||''"
  73. ></el-input>
  74. </el-form-item>
  75. <el-form-item v-else class="space-form-item"></el-form-item>
  76. </el-col>
  77. </el-row>
  78. </el-col>
  79. <el-col :span="8">
  80. <uploadFile :upImgsStr="formObj.image" :uploadImg="uploadImg" @uploadfun="uploadfun"></uploadFile>
  81. </el-col>
  82. </el-row>
  83. </el-form>
  84. <div slot="footer" class="dialog-footer" align="center">
  85. <el-button @click="dialogFormVisible = false">取 消</el-button>
  86. <el-button type="primary" @click="submitForm('formObj')">保 存</el-button>
  87. </div>
  88. </el-dialog>
  89. </template>
  90. <script>
  91. import { addDoctor, updateDoctor, doctorLogo, checkDoctor } from '@/api/api'
  92. import { requiredTip, strToArr, arrToStr } from '@/utils'
  93. import uploadFile from '@/components/uploadFile'
  94. import dynamicTags from '@/components/DynamicTags'
  95. import { slelectTeachTitle, slelectClinicalTitle } from '@/utils/dict'
  96. export default {
  97. data() {
  98. return {
  99. objId: '',
  100. dialogFormVisible: false,
  101. formItem: [
  102. {
  103. span: 12,
  104. prop: 'account',
  105. tit: '账号',
  106. num: 20,
  107. required: true
  108. },
  109. {
  110. span: 12,
  111. prop: 'name',
  112. tit: '医生姓名',
  113. num: 20,
  114. required: true
  115. },
  116. {
  117. span: 12,
  118. prop: 'department',
  119. tit: '所属科室',
  120. num: 20,
  121. selectSearch: true,
  122. required: true
  123. },
  124. {
  125. span: 12,
  126. prop: 'clinicalTitle',
  127. tit: '临床职称',
  128. cascader: slelectClinicalTitle
  129. },
  130. {
  131. span: 12,
  132. prop: 'teachTitle',
  133. tit: '教学职称',
  134. select: slelectTeachTitle
  135. },
  136. {
  137. span: 12,
  138. prop: 'position',
  139. tit: '行政职务',
  140. num: 20
  141. },
  142. {
  143. span: 24,
  144. prop: 'direction',
  145. tit: '擅长方向',
  146. tag: {
  147. lableTit: '擅长方向',
  148. placeholder: '请填写擅长方向 例如:冠心病、高血压、糖尿病',
  149. limitCount: 15,
  150. tagsNum: 20
  151. }
  152. },
  153. {
  154. span: 24,
  155. prop: 'descp',
  156. tit: '医院简介',
  157. textarea: true,
  158. num: 2000
  159. }
  160. ],
  161. formLoading: false,
  162. formObj: {
  163. account: '',
  164. name: '',
  165. department: '',
  166. clinicalTitle: [],
  167. teachTitle: '',
  168. position: '',
  169. direction: '',
  170. descp: '',
  171. image: ''
  172. },
  173. rulesObj: {},
  174. uploadImg: {
  175. url: doctorLogo,
  176. tip: '上传图片',
  177. width: '220px',
  178. height: '220px'
  179. },
  180. dyStrArr: []
  181. }
  182. },
  183. computed: {
  184. departList() {
  185. return this.$store.getters.departArrs
  186. }
  187. },
  188. components: {
  189. uploadFile,
  190. dynamicTags
  191. },
  192. created() {
  193. this.pushRulesFn()
  194. },
  195. methods: {
  196. pushRulesFn() {
  197. const formItem = this.formItem
  198. const rulesObj = this.rulesObj
  199. for (let i = 0; i < formItem.length; ++i) {
  200. const ru = []
  201. if (formItem[i].required) {
  202. if (formItem[i].prop === 'account') {
  203. ru.push({
  204. required: true,
  205. validator: (rule, value, callback) => {
  206. const reg = /^1[3|4|5|7|8][0-9]\d{8}$/
  207. if (!value) {
  208. callback(new Error('请输入账户'))
  209. } else {
  210. if (!reg.test(value)) {
  211. callback(new Error('请输入手机号码账号'))
  212. } else {
  213. var obj = {}
  214. if (this.objId) {
  215. obj = {
  216. active: 1,
  217. account: value,
  218. id: this.objId
  219. }
  220. } else {
  221. obj = {
  222. active: 1,
  223. account: value
  224. }
  225. }
  226. this.$http.get(checkDoctor, obj, function(res) {
  227. if (res.success) {
  228. if (res.data) {
  229. callback(new Error('账户已存在,请重新输入'))
  230. } else {
  231. callback()
  232. }
  233. }
  234. })
  235. }
  236. }
  237. },
  238. trigger: 'blur'
  239. })
  240. } else {
  241. ru.push({
  242. required: true,
  243. message: requiredTip(formItem[i].tit),
  244. trigger: 'blur'
  245. })
  246. }
  247. }
  248. rulesObj[formItem[i].prop] = ru
  249. }
  250. },
  251. openDiag(val) {
  252. var that = this
  253. if (val) {
  254. this.objId = val.id
  255. this.formObj = {
  256. account: val.account,
  257. name: val.name,
  258. department: val.department,
  259. clinicalTitle: [],
  260. teachTitle: val.teachTitle,
  261. position: val.position,
  262. direction: val.direction,
  263. descp: val.descp,
  264. image: val.image
  265. }
  266. if (val.clinicalTitle) {
  267. this.formObj.clinicalTitle = strToArr(val.clinicalTitle)
  268. }
  269. if (val.direction) {
  270. this.dyStrArr = strToArr(val.direction)
  271. }
  272. } else {
  273. this.objId = ''
  274. this.dyStrArr = []
  275. this.formObj = {
  276. account: '',
  277. name: '',
  278. department: '',
  279. clinicalTitle: [],
  280. teachTitle: '',
  281. position: '',
  282. direction: '',
  283. descp: '',
  284. image: ''
  285. }
  286. }
  287. setTimeout(() => {
  288. that.dialogFormVisible = true
  289. }, 1)
  290. },
  291. closeForm(formName) {
  292. this.$refs[formName].resetFields()
  293. this.formObj.image = ''
  294. this.$parent.resetInfo()
  295. this.dialogFormVisible = false
  296. },
  297. submitForm(formName) {
  298. var that = this
  299. that.$refs[formName].validate((valid) => {
  300. if (valid) {
  301. const form = that.formObj
  302. const paramsData = {
  303. name: form.name,
  304. account: form.account,
  305. department: form.department,
  306. clinicalTitle: arrToStr(form.clinicalTitle),
  307. teachTitle: form.teachTitle,
  308. position: form.position,
  309. direction: form.direction,
  310. descp: form.descp,
  311. image: form.image
  312. }
  313. if (that.objId) {
  314. const paramsId = { id: that.objId }
  315. const obj = Object.assign(paramsId, paramsData)
  316. that.$http.post(updateDoctor, obj, function(res) {
  317. if (res.success) {
  318. that.$message({
  319. message: '信息修改成功',
  320. type: 'success'
  321. })
  322. that.closeForm(formName)
  323. }
  324. })
  325. } else {
  326. that.$http.post(addDoctor, paramsData, function(res) {
  327. if (res.success) {
  328. that.$message({
  329. message: '信息添加成功',
  330. type: 'success'
  331. })
  332. that.closeForm(formName)
  333. }
  334. })
  335. }
  336. } else {
  337. window.scroll(0, 0)
  338. return false
  339. }
  340. })
  341. },
  342. uploadfun(value) {
  343. this.formObj.image = value
  344. },
  345. turnTags(value) {
  346. this.formObj.direction = value
  347. },
  348. changeCascader(val) {
  349. // this.formObj.clinicalTitle = val
  350. }
  351. }
  352. }
  353. </script>