AddKnowledge.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584
  1. <template>
  2. <div class="wrapper">
  3. <crumbs
  4. :title="isEdit ? '知识图谱标准术语维护-修改' : '知识图谱标准术语维护-添加'"
  5. class="topBack"
  6. :param="$route.params"
  7. linkTo="KnowledgeManage"
  8. ></crumbs>
  9. <div class="AddPlanBox">
  10. <el-row :gutter="20">
  11. <el-col :span="16">
  12. <el-form ref="form" :model="form" label-width="110px" :rules="rules">
  13. <el-form-item label="术语分类" class="selectMedicine" prop="labelType">
  14. <el-select
  15. v-model="form.labelType"
  16. placeholder="请选择术语分类"
  17. clearable
  18. filterable
  19. style="width: 100%"
  20. :disabled="isEdit"
  21. >
  22. <el-option
  23. v-for="item in terminologyData"
  24. :label="item.name"
  25. :value="item.val"
  26. :key="item.orderNo"
  27. ></el-option>
  28. </el-select>
  29. </el-form-item>
  30. <el-form-item label="术语名称" prop="name">
  31. <el-input
  32. v-model.trim="form.name"
  33. placeholder="请输入术语名称"
  34. @blur="handlePinyin($event)"
  35. @input="handlePinyinInput"
  36. :disabled="form.labelType===''"
  37. ></el-input>
  38. </el-form-item>
  39. <el-form-item label="术语拼音" prop="pycode">
  40. <el-input
  41. v-model.trim="form.pycode"
  42. placeholder="请输入术语拼音"
  43. ref="pycode"
  44. ></el-input>
  45. </el-form-item>
  46. <!-- 诊断 -->
  47. <DiseaseForm v-if="form.labelType==='医保疾病名称'" :data="form" @handleInput="handleInput"></DiseaseForm>
  48. <!-- 手术和操作 -->
  49. <OperationForm
  50. v-else-if="form.labelType==='医保手术和操作名称'"
  51. ref="operationForm"
  52. :data="form"
  53. @handleInput="handleInput"
  54. ></OperationForm>
  55. <!-- 检查 | 检查子项 -->
  56. <PacsForm
  57. v-else-if="form.labelType==='辅助检查名称' || form.labelType === '辅助检查子项目名称'"
  58. :key="form.labelType"
  59. :data="form"
  60. @handleInput="handleInput"
  61. ></PacsForm>
  62. <!-- 检验细项 -->
  63. <PacsDetailForm
  64. v-else-if="form.labelType==='实验室检查名称' "
  65. :data="form"
  66. @handleInput="handleInput"
  67. ></PacsDetailForm>
  68. <!-- 实验室检查细项(开单合理性) -->
  69. <LabPacsForm
  70. v-else-if="form.labelType==='实验室检查' "
  71. :data="form"
  72. @handleInput="handleInput"
  73. ></LabPacsForm>
  74. <!-- 化验细项及结果(推理)-->
  75. <AssayForm
  76. v-else-if="form.labelType==='化验细项及结果' "
  77. ref="assayForm"
  78. :data="form"
  79. @handleInput="handleInput"
  80. ></AssayForm>
  81. <!-- 药物过敏原-->
  82. <DrugAllergensForm
  83. v-else-if="form.labelType==='药物过敏原'"
  84. ref="drugAllergensForm"
  85. :data="form"
  86. @handleInput="handleInput"
  87. ></DrugAllergensForm>
  88. <!-- 药品注册名称-->
  89. <DrugRegNameForm
  90. v-else-if="form.labelType==='药品注册名称' "
  91. :data="form"
  92. @handleInput="handleInput"
  93. ></DrugRegNameForm>
  94. <!-- 药品代码通用名-->
  95. <DrugGeneNameForm
  96. v-else-if="form.labelType==='药品代码通用名' "
  97. ref="drugGeneNameForm"
  98. :data="form"
  99. @handleInput="handleInput"
  100. ></DrugGeneNameForm>
  101. <!-- 体征 | 实验室检查危急值-->
  102. <CommonForm
  103. v-else-if="form.labelType==='实验室检查危急值' || form.labelType === '体征'"
  104. :key="form.labelType"
  105. :data="form"
  106. @handleInput="handleInput"
  107. ></CommonForm>
  108. <el-form-item label="静态术语标识">
  109. <span style="paddingLeft: 12px; color: #606266">{{form.is_kl === 1? '有' : '无'}}</span>
  110. </el-form-item>
  111. <el-form-item>
  112. <el-button type="primary" @click="onSubmit" :disabled="saveDisable">确定</el-button>
  113. </el-form-item>
  114. </el-form>
  115. </el-col>
  116. </el-row>
  117. </div>
  118. </div>
  119. </template>
  120. <script>
  121. import api from '@api/cdss.js';
  122. import pinyin from '../../../js/Convert_Pinyin.js';
  123. import DiseaseForm from './DiseaseForm';
  124. import OperationForm from './OperationForm';
  125. import PacsForm from './PacsForm';
  126. import PacsDetailForm from './PacsDetailForm';
  127. import LabPacsForm from './LabPacsForm';
  128. import AssayForm from './AssayForm';
  129. import DrugAllergensForm from './DrugAllergensForm';
  130. import DrugRegNameForm from './DrugRegNameForm';
  131. import DrugGeneNameForm from './DrugGeneNameForm';
  132. import CommonForm from './CommonForm';
  133. export default {
  134. components: {
  135. DiseaseForm,
  136. OperationForm,
  137. PacsForm,
  138. PacsDetailForm,
  139. LabPacsForm,
  140. AssayForm,
  141. DrugAllergensForm,
  142. DrugRegNameForm,
  143. DrugGeneNameForm,
  144. CommonForm
  145. },
  146. data() {
  147. let reg = /[\u4E00-\u9FA5\uF900-\uFA2D]/;
  148. let checkFrequency = (rule, value, callback) => {
  149. let pycode = this.$refs.pycode.value;
  150. if (reg.test(pycode && pycode.trim())) {
  151. callback('术语拼音仅支持字母、数字和标点符号');
  152. } else {
  153. callback();
  154. }
  155. };
  156. return {
  157. form: {
  158. age: '', //年龄
  159. alias: '', //别名(医保诊断名称、药物过敏原、药品注册名称)
  160. category: '', //诊断分类(医保诊断名称属性:1、2,无默认值)
  161. conflict_geiyao: '', //禁忌给药途径(药品注册名称属性)
  162. conflict_gender: '', //禁忌性别(药品注册名称属性)
  163. dept: '', //诊断所属科室(医保诊断名称属性)
  164. gender: '', //性别
  165. highriskcond: '', //高危条件(医保手术和操作属性)
  166. // id: 0,
  167. is_kl: 0, //静态知识标识(0-无,1-有,默认0)
  168. labelType: '', //术语类型-知识图谱标签类型(详情见字典)
  169. maxAge: '', // 最大值(实验室检查名称)
  170. maxval: '', //最小值(实验室检查名称)
  171. medtype: '', //药品类型(药物过敏原属性:药品、药品类别)
  172. minAge: '', //年龄下限(医保诊断名称属性)
  173. minval: '', //年龄上限(医保诊断名称属性)
  174. name: '', //术语名称
  175. opgrade: '', //手术等级(医保手术和操作属性:0、1、2、3、4,默认0)
  176. pycode: '', //拼音编码
  177. range: 0, //范围(0-范围内,1-范围外,默认0)
  178. result: '', //结果(药物过敏原、药品注册名称)
  179. risklevel: '', //药品高危级别(药品注册名称属性)
  180. special: '否', //特殊标志(化验细项及结果属性:是)
  181. status: 1, //状态(0-禁用,1-启用,默认1)
  182. unit: '', //单位(实验室检查名称、实验室检查、体征、实验室检查危急值)
  183. min_pack_num: null, //最小包装数量(药品代码通用名属性)
  184. reg_JiXin: '', //注册剂型(药品代码通用名属性)
  185. benWei_Code: '', //药品本位码(药品代码通用名属性)
  186. min_pack_unit: '', //最小包装单位(药品代码通用名属性)
  187. reg_GuiGe: '', //注册规格(药品代码通用名属性)
  188. pack_CaiLiao: '', //包装材质(药品代码通用名属性)
  189. producer: '', //药品企业(药品代码通用名属性)
  190. license_num: '', //批准文号(药品代码通用名属性)
  191. min_prod_unit: '', //最小制剂单位(药品代码通用名属性)
  192. stand_reg_JiXin: '' //标准注册剂型(药品代码通用名属性)
  193. },
  194. saveDisable: false, //保存按钮禁止点击
  195. rules: {
  196. labelType: [
  197. { required: true, message: '请选择术语分类', trigger: 'change' }
  198. ],
  199. name: [
  200. { required: true, message: '请输入术语名称', trigger: 'change' },
  201. { max: 100, message: '最多输入100字', trigger: 'blur' }
  202. ],
  203. pycode: [
  204. { required: true, message: '请输入术语拼音', trigger: 'change' },
  205. { max: 100, message: '最多输入100个字符', trigger: ['blur', 'change']},
  206. {
  207. required: true,
  208. validator: checkFrequency,
  209. trigger: ['blur', 'change']
  210. }
  211. ]
  212. },
  213. isEdit: false,
  214. terminologyData: [], // 术语分类
  215. nameFlag: '', // 判断术语名称是否被修改
  216. isValidate: true,
  217. id: '',
  218. isTrans: true // 拼音是否转换成功
  219. };
  220. },
  221. watch: {},
  222. computed: {},
  223. created() {
  224. this._initData();
  225. },
  226. mounted() {},
  227. methods: {
  228. // init
  229. _initData() {
  230. const { isEdit, data } = this.$route.params;
  231. this._getTerminologyData();
  232. if (isEdit) {
  233. this.isEdit = true;
  234. this.id = data.id;
  235. this.nameFlag = data.name; //判断术语名称是否被修改
  236. this._getEntitymanById(data.id);
  237. }
  238. },
  239. // 根据ID获取实例
  240. _getEntitymanById(id) {
  241. api.getEntitymanById({ id }).then(res => {
  242. if (res.data.code === '0') {
  243. this.form.age = res.data.data.age;
  244. this.form.alias = res.data.data.alias;
  245. this.form.category = res.data.data.category;
  246. this.form.conflict_geiyao = res.data.data.conflict_geiyao;
  247. this.form.conflict_gender = res.data.data.conflict_gender;
  248. this.form.dept = res.data.data.dept;
  249. this.form.gender = res.data.data.gender;
  250. this.form.highriskcond = res.data.data.highriskcond;
  251. this.form.is_kl = res.data.data.is_kl;
  252. this.form.labelType = res.data.data.labelType;
  253. this.form.maxAge = res.data.data.maxAge;
  254. this.form.maxval = res.data.data.maxval;
  255. this.form.medtype = res.data.data.medtype;
  256. this.form.minAge = res.data.data.minAge;
  257. this.form.minval = res.data.data.minval;
  258. this.form.name = res.data.data.name;
  259. this.form.opgrade = res.data.data.opgrade;
  260. this.form.pycode = res.data.data.pycode;
  261. this.form.range = res.data.data.range;
  262. this.form.result = res.data.data.result;
  263. this.form.risklevel = res.data.data.risklevel;
  264. this.form.special = res.data.data.special;
  265. this.form.status = res.data.data.status;
  266. this.form.unit = res.data.data.unit;
  267. this.form.min_pack_num = res.data.data.min_pack_num; //最小包装数量(药品代码通用名属性)
  268. this.form.reg_JiXin = res.data.data.reg_JiXin; //注册剂型(药品代码通用名属性)
  269. this.form.benWei_Code = res.data.data.benWei_Code; //药品本位码(药品代码通用名属性)
  270. this.form.min_pack_unit = res.data.data.min_pack_unit; //最小包装单位(药品代码通用名属性)
  271. this.form.reg_GuiGe = res.data.data.reg_GuiGe; //注册规格(药品代码通用名属性)
  272. this.form.pack_CaiLiao = res.data.data.pack_CaiLiao; //包装材质(药品代码通用名属性)
  273. this.form.producer = res.data.data.producer; //药品企业(药品代码通用名属性)
  274. this.form.license_num = res.data.data.license_num; //批准文号(药品代码通用名属性)
  275. this.form.min_prod_unit = res.data.data.min_prod_unit; //最小制剂单位(药品代码通用名属性)
  276. this.form.stand_reg_JiXin = res.data.data.stand_reg_JiXin; //标准注册剂型(药品代码通用名属性)
  277. }
  278. });
  279. },
  280. handleInput(data) {
  281. const { type } = data;
  282. if (type !== '') {
  283. this.form[type] = data.value;
  284. }
  285. },
  286. // 获取术语分类 字典
  287. _getTerminologyData() {
  288. api.getListDicCDSS().then(res => {
  289. if (res.data.code === '0') {
  290. this.terminologyData = res.data.data && res.data.data['8'];
  291. }
  292. });
  293. },
  294. // 处理参数
  295. _getParams() {
  296. const {
  297. age,
  298. alias,
  299. category,
  300. conflict_geiyao,
  301. conflict_gender,
  302. dept,
  303. gender,
  304. highriskcond,
  305. is_kl,
  306. labelType,
  307. maxAge,
  308. maxval,
  309. medtype,
  310. minAge,
  311. minval,
  312. name,
  313. opgrade,
  314. pycode,
  315. range,
  316. result,
  317. risklevel,
  318. special,
  319. status,
  320. unit,
  321. min_pack_num, //最小包装数量(药品代码通用名属性)
  322. reg_JiXin, //注册剂型(药品代码通用名属性)
  323. benWei_Code, //药品本位码(药品代码通用名属性)
  324. min_pack_unit, //最小包装单位(药品代码通用名属性)
  325. reg_GuiGe, //注册规格(药品代码通用名属性)
  326. pack_CaiLiao, //包装材质(药品代码通用名属性)
  327. producer, //药品企业(药品代码通用名属性)
  328. license_num, //批准文号(药品代码通用名属性)
  329. min_prod_unit, //最小制剂单位(药品代码通用名属性)
  330. stand_reg_JiXin //标准注册剂型(药品代码通用名属性)
  331. } = this.form;
  332. let params = {
  333. age, //年龄
  334. alias, //别名(医保诊断名称、药物过敏原、药品注册名称)
  335. category, //诊断分类(医保诊断名称属性:1、2,无默认值)
  336. conflict_geiyao, //禁忌给药途径(药品注册名称属性)
  337. conflict_gender, //禁忌性别(药品注册名称属性)
  338. dept, //诊断所属科室(医保诊断名称属性)
  339. gender, //性别
  340. highriskcond, //高危条件(医保手术和操作属性)
  341. is_kl, //静态知识标识(0-无,1-有,默认0)
  342. labelType, //术语类型-知识图谱标签类型(详情见字典)
  343. maxAge, // 最大值(实验室检查名称)
  344. maxval, //最小值(实验室检查名称)
  345. medtype, //药品类型(药物过敏原属性:药品、药品类别)
  346. minAge, //年龄下限(医保诊断名称属性)
  347. minval, //年龄上限(医保诊断名称属性)
  348. name, //术语名称
  349. opgrade, //手术等级(医保手术和操作属性:0、1、2、3、4,默认0)
  350. pycode, //拼音编码
  351. range, //范围(0-范围内,1-范围外,默认0)
  352. result, //结果(药物过敏原、药品注册名称)
  353. risklevel, //药品高危级别(药品注册名称属性)
  354. special, //特殊标志(化验细项及结果属性:是)
  355. status: 1, //状态(0-禁用,1-启用,默认1)
  356. unit, //单位(实验室检查名称、实验室检查、体征、实验室检查危急值)
  357. min_pack_num, //最小包装数量(药品代码通用名属性)
  358. reg_JiXin, //注册剂型(药品代码通用名属性)
  359. benWei_Code, //药品本位码(药品代码通用名属性)
  360. min_pack_unit, //最小包装单位(药品代码通用名属性)
  361. reg_GuiGe, //注册规格(药品代码通用名属性)
  362. pack_CaiLiao, //包装材质(药品代码通用名属性)
  363. producer, //药品企业(药品代码通用名属性)
  364. license_num, //批准文号(药品代码通用名属性)
  365. min_prod_unit, //最小制剂单位(药品代码通用名属性)
  366. stand_reg_JiXin //标准注册剂型(药品代码通用名属性)
  367. };
  368. if (this.isEdit) {
  369. params = { ...params, id: this.id };
  370. }
  371. return params;
  372. },
  373. onSubmit() {
  374. const { currentPage, isEdit } = this.$route.params;
  375. let numberpage = 1;
  376. if (isEdit) {
  377. numberpage = currentPage;
  378. }
  379. // if (this.isValidate === false || this.isTrans === false) return; // 术语名称已存在
  380. if (this.isValidate === false) return; // 术语名称已存在ss
  381. let goOn = true;
  382. if (this.form.labelType === '药物过敏原') {
  383. this.$refs.drugAllergensForm.$refs.drugAllergensForm &&
  384. this.$refs.drugAllergensForm.$refs.drugAllergensForm.validate(
  385. valid => {
  386. if (valid) {
  387. } else {
  388. goOn = false;
  389. }
  390. }
  391. );
  392. }
  393. if (this.form.labelType === '医保手术和操作名称') {
  394. this.$refs.operationForm.$refs.operationForm &&
  395. this.$refs.operationForm.$refs.operationForm.validate(valid => {
  396. if (valid) {
  397. } else {
  398. goOn = false;
  399. }
  400. });
  401. }
  402. // if (this.form.labelType === '化验细项及结果') {
  403. // this.$refs.assayForm.$refs.assayForm &&
  404. // this.$refs.assayForm.$refs.assayForm.validate(valid => {
  405. // if (valid) {
  406. // } else {
  407. // goOn = false;
  408. // }
  409. // });
  410. // }
  411. if (this.form.labelType === '药品代码通用名') {
  412. this.$refs.drugGeneNameForm.$refs.drugGeneNameForm &&
  413. this.$refs.drugGeneNameForm.$refs.drugGeneNameForm.validate(valid => {
  414. if (valid) {
  415. } else {
  416. goOn = false;
  417. }
  418. });
  419. }
  420. this.$refs.form.validate(async valid => {
  421. if (valid) {
  422. if (!goOn) return;
  423. this.saveDisable = true;
  424. let params = this._getParams();
  425. if (this.isTrans === false) {
  426. this.saveDisable = false;
  427. return;
  428. }
  429. let res = await api.dataEntityVerify(params);
  430. if (!res.data.data) {
  431. this.$alert(`${res.data.msg}`, '提示', {
  432. confirmButtonText: '确定',
  433. type: 'warning'
  434. })
  435. .then(() => {
  436. api.saveEntity(params).then(res => {
  437. if (res.data.code === '0') {
  438. this.$message({
  439. showClose: true,
  440. message: '保存成功',
  441. type: 'success',
  442. duration: 1000
  443. });
  444. this.$router.push({
  445. name: 'KnowledgeManage',
  446. params: Object.assign({}, this.$route.params, {
  447. currentPage: numberpage
  448. })
  449. });
  450. } else if (res.data.code === '00020007') {
  451. this.$message({
  452. showClose: true,
  453. message: res.data.msg,
  454. type: 'error',
  455. duration: 1000
  456. });
  457. } else {
  458. this.$message({
  459. showClose: true,
  460. message: res.data.msg,
  461. type: 'error',
  462. duration: 1000
  463. });
  464. }
  465. this.saveDisable = false;
  466. });
  467. })
  468. .catch(() => {
  469. this.saveDisable = false;
  470. this.$message({
  471. showClose: true,
  472. message: '保存失败',
  473. type: 'error',
  474. duration: 1000
  475. });
  476. });
  477. } else if (res.data.data) {
  478. api.saveEntity(params).then(res => {
  479. if (res.data.code === '0') {
  480. this.$message({
  481. showClose: true,
  482. message: '保存成功',
  483. type: 'success',
  484. duration: 1000
  485. });
  486. this.$router.push({
  487. name: 'KnowledgeManage',
  488. params: Object.assign({}, this.$route.params, {
  489. currentPage: numberpage
  490. })
  491. });
  492. } else if (res.data.code === '00020007') {
  493. this.$message({
  494. showClose: true,
  495. message: res.data.msg,
  496. type: 'error',
  497. duration: 1000
  498. });
  499. } else {
  500. this.$message({
  501. showClose: true,
  502. message: res.data.msg,
  503. type: 'error',
  504. duration: 1000
  505. });
  506. }
  507. this.saveDisable = false;
  508. });
  509. }
  510. } else {
  511. goOn = false;
  512. }
  513. });
  514. },
  515. handlePinyinInput(val) {
  516. this.isTrans = false;
  517. },
  518. // 处理拼音转换&验证唯一性
  519. handlePinyin(e) {
  520. if (this.nameFlag === e.target.value) {
  521. this.isTrans = true;
  522. this.isValidate = true; // 校验通过
  523. this.form.pycode = pinyin.getCamelChars(e.target.value);
  524. } else {
  525. const { is_kl, name, labelType } = this.form;
  526. let params = {
  527. is_kl,
  528. labelType,
  529. name,
  530. status: 0
  531. };
  532. api.isEntitymanExistCDSS(params).then(res => {
  533. if (res.data.code === '0') {
  534. // console.log(res.data.data, 'res.data.data');
  535. if (res.data.data === true) {
  536. this.isValidate = false; // 校验不通过
  537. // 已存在
  538. this.$refs.form.clearValidate();
  539. // 手动操作校验、展示登录错误信息
  540. this.rules.name.push({
  541. // js新增一个自定义校验
  542. validator: (rule, value, callback) => {
  543. callback('术语名称已存在');
  544. },
  545. trigger: 'blur'
  546. });
  547. this.$refs.form.validateField('name'); // 手动校验
  548. this.rules.name = this.rules.name.slice(0, 1); // 删除校验
  549. } else {
  550. this.isValidate = true; // 校验通过
  551. this.isTrans = true;
  552. // 不存在
  553. this.form.pycode = pinyin.getCamelChars(e.target.value);
  554. }
  555. }
  556. });
  557. }
  558. }
  559. }
  560. };
  561. </script>
  562. <style lang="less" scoped>
  563. .wrapper {
  564. min-width: 940px;
  565. .AddPlanBox {
  566. padding: 20px 60px 120px 60px;
  567. margin: 70px 20px 0 20px;
  568. background: #fff;
  569. }
  570. .topBack {
  571. top: 0;
  572. }
  573. .el-button {
  574. float: right;
  575. }
  576. }
  577. </style>