AddMedicinePrompt.vue 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <template>
  2. <div class="NoiseTemplateWrapper TemplateWrapper">
  3. <crumbs
  4. :title="'医学术语静态知识维护-'+title"
  5. class="topBack"
  6. :param="$route.params"
  7. linkTo="MedicinePrompt"
  8. ></crumbs>
  9. <div class="info-container">
  10. <el-form :rules="rules"
  11. :model="form"
  12. label-width="160px"
  13. ref="groups">
  14. <el-form-item v-if="!isEdit" label="选择标准术语:" prop="selectedTerm">
  15. <el-select v-model="form.selectedTerm"
  16. filterable
  17. remote
  18. clearable
  19. :loading="showDrop"
  20. loading-text="加载中..."
  21. @change="changeWord"
  22. value-key="conceptId"
  23. ref="termName"
  24. placeholder="搜索"
  25. :remote-method="searchTerms">
  26. <el-option v-for="term in terms" :key="term.conceptId" :label="term.nameType" :value="term" ></el-option>
  27. </el-select>
  28. </el-form-item>
  29. <el-form-item label="已选择标准术语:" label-width="160px">
  30. {{form.selectedTermName}}
  31. </el-form-item>
  32. <p class="line"></p>
  33. <InfoParagraph v-for="(f,i) in form.prags"
  34. :data="f"
  35. :index="i"
  36. :total="form.prags.length"
  37. :isEdit = "isEdit"
  38. ref="subForm"
  39. @add="addParagraph(i)"
  40. @del="delParagraph"
  41. @reOrder="reOrder"></InfoParagraph>
  42. </el-form>
  43. <div class="btn">
  44. <el-button
  45. type="primary"
  46. :disabled = 'saveDisable'
  47. @click="submitForm"
  48. >确 定</el-button>
  49. </div>
  50. </div>
  51. </div>
  52. </template>
  53. <script>
  54. /**
  55. *
  56. */
  57. import api from '@api/icss.js';
  58. import InfoParagraph from './MedicineInfoPg';
  59. import config from '@api/config';
  60. export default {
  61. name: 'AddMedicinePrompt',
  62. components: {
  63. InfoParagraph
  64. },
  65. data() {
  66. return {
  67. isEdit:false,
  68. isCopy:false,
  69. title:'添加',
  70. termTypes:[],
  71. terms:[], //术语列表
  72. form:{
  73. conceptId:'', //术语id
  74. isTip:0, //是否要覆盖,0不覆盖,1覆盖
  75. selectedTerm:'', //术语标签
  76. termType:'',
  77. selectedTermName:'',
  78. selectedTermType:'',
  79. prags:[{ //单个段落相关
  80. title:'',
  81. content:'',
  82. isReason:0,
  83. orderNo:0,
  84. position:[],
  85. text:''}]
  86. },
  87. rules: {
  88. selectedTerm: [
  89. { required: true, message: '请选择术语标签', trigger: 'change' }
  90. ]
  91. },
  92. saveDisable: false, //保存按钮禁止点击
  93. showDrop:false, //下拉框显示文字bug1774
  94. }
  95. },
  96. /*watch:{
  97. 'form.selectedTerm':function(newVal){
  98. const name = newVal.nameType;console.log(newVal)
  99. this.form.selectedTermName = name;
  100. this.form.conceptId = newVal.conceptId;
  101. }
  102. },*/
  103. created:function(){
  104. const {isEdit,data,isCopy} = this.$route.params;
  105. if(isEdit||isCopy){
  106. this.isEdit = isEdit;
  107. this.isCopy = isCopy;
  108. this.title = isEdit?'编辑':(isCopy?'复制':'添加');
  109. isEdit&&this.changeWord(data);
  110. //this.form.selectedTerm = data;
  111. //this.form.selectedTermName = data.libName;
  112. //this.form.conceptId = data.conceptId;
  113. api.getTremList({conceptId:data.conceptId}).then((res) => {
  114. if (res.data.code == '0') {
  115. const data = res.data.data;
  116. this.form.prags=data&&data.map((it)=>{
  117. return {
  118. title:it.title,
  119. position:this.mapStringToNum(it.position),
  120. content:it.content.replace(/{imageUrlPrefix}/g,config.imgHost),
  121. isReason:it.isReason,
  122. text:it.text,
  123. disabled:true};
  124. });
  125. }
  126. }).catch((error) => {
  127. console.log(error);
  128. });
  129. }
  130. },
  131. methods: {
  132. changeWord(newVal){
  133. const name = newVal.nameType;
  134. this.form.selectedTermName = name;
  135. this.form.selectedTerm=name;
  136. this.form.conceptId = newVal.conceptId;
  137. },
  138. reOrder(isUp,i){
  139. let temp = {},it={};
  140. if(isUp===1){
  141. if(i===0){
  142. this.warning('已经是第一个,不能再升啦!');
  143. return ;
  144. }
  145. temp = Object.assign(this.form.prags[i-1]);
  146. temp.orderNo = temp.orderNo+1;
  147. it = Object.assign(this.form.prags[i]);
  148. it.orderNo = it.orderNo-1;
  149. this.form.prags.splice(i-1,2,it,temp);
  150. }else{
  151. if(i===this.form.prags.length-1){
  152. this.warning('已经是最后一个,不能再降啦!');
  153. return ;
  154. }
  155. temp = Object.assign(this.form.prags[i+1]);
  156. temp.orderNo = temp.orderNo-1;
  157. it = Object.assign(this.form.prags[i]);
  158. it.orderNo = it.orderNo+1;
  159. this.form.prags.splice(i,2,temp,it);
  160. }
  161. },
  162. addParagraph(i){
  163. this.form.prags.splice(i+1,0,{
  164. title:'',
  165. content:'',
  166. isReason:0,
  167. orderNo:i+1,
  168. position:[],
  169. text:''});
  170. /*this.form.prags.push({
  171. title:'',
  172. content:'',
  173. isReason:0,
  174. orderNo:this.form.prags.length,
  175. position:[],
  176. text:''});*/
  177. },
  178. delParagraph(i){
  179. if(this.form.prags.length==1){
  180. this.warning('只剩一个段落,不能再删啦!');
  181. return;
  182. }
  183. this.showConfirmDialog('确定要删除该段落?', () => {
  184. this.form.prags.splice(i,1);
  185. });
  186. },
  187. back() { this.$router.go(-1) },
  188. searchTerms(query){
  189. if(!query.trim()){
  190. return;
  191. }
  192. //搜索术语列表
  193. this.showDrop = true;
  194. api.getAllConcept({name:query.trim()}).then((res) =>{
  195. this.showDrop = false;
  196. if(res.data.code === '0') {
  197. this.terms = res.data.data;
  198. }else{
  199. this.warning("数据获取失败");
  200. }
  201. })
  202. },
  203. mapStringToNum(str){
  204. return str.split(",").map((it)=>{
  205. return +it;
  206. })
  207. },
  208. submitForm() {
  209. //验证外层表单
  210. let goOn=true,it=null;
  211. this.$refs.groups.validate((valid) =>{
  212. if(!valid){
  213. goOn = false;
  214. return false;
  215. }
  216. });
  217. //验证段落表单
  218. for(let i=0;i<this.$refs.subForm.length;i++){
  219. it=this.$refs.subForm[i];
  220. it.$refs.form.validate((valid) =>{
  221. if(!valid){
  222. goOn = false;
  223. }
  224. });
  225. };
  226. if(!goOn){
  227. return;
  228. }
  229. //通过必填验证,提交保存
  230. const item=this.form.prags;
  231. const param =item.map((it)=>{
  232. return Object.assign({},it,{
  233. position:typeof it.position=='string'?it.position:it.position.join(","),
  234. conceptId:this.form.conceptId,
  235. content:it.content.replace(new RegExp(config.imgHost,'g'),'{imageUrlPrefix}')});
  236. });
  237. this.showSaveDialog(param,'是否保存该静态知识?');
  238. },
  239. showSaveDialog(param,msg) {
  240. this.showConfirmDialog(msg, () => {
  241. this.saveDisable = true //提交保存按钮不可点击,返回结果时才可点击,防止频繁发送请求
  242. api.saveTermPrompts(param).then((res) => {
  243. if (res.data.code === '0') {
  244. this.warning(res.data.msg || '保存成功', 'success');
  245. //返回带搜索条件的首页
  246. this.$router.push({name:'MedicinePrompt',params:Object.assign({},this.$route.params,{currentPage:1})});
  247. } else {
  248. this.warning(res.data.msg)
  249. }
  250. this.saveDisable = false
  251. }).catch((err) => {
  252. this.warning(err);
  253. })
  254. });
  255. },
  256. showConfirmDialog(msg, resolve) {
  257. this.$confirm(msg, '提示', {
  258. confirmButtonText: '确定',
  259. cancelButtonText: '取消',
  260. cancelButtonClass:'cancel',
  261. type: 'warning'
  262. }).then(() => {
  263. resolve();
  264. }).catch(() => {});
  265. },
  266. warning(msg, type) {
  267. this.$message({
  268. showClose: true,
  269. message: msg,
  270. type: type || 'warning'
  271. })
  272. },
  273. }
  274. }
  275. </script>
  276. <style lang="less">
  277. @import "../../less/common.less";
  278. .topBack{
  279. top: 0;
  280. }
  281. .info-container{
  282. background: #fff;
  283. padding: 20px;
  284. margin: 70px 20px -20px 20px;
  285. .el-input__inner{
  286. width: 200px;
  287. }
  288. .el-form-item__label{
  289. text-align: left;
  290. }
  291. .add-prg .el-form-item{
  292. margin-bottom: 20px;
  293. }
  294. }
  295. .cancel span{
  296. color: #22ccc8;
  297. }
  298. .line{
  299. border-top:1px #dcdfe6 solid;
  300. margin-bottom: 25px;
  301. }
  302. .NoiseTemplateWrapper .info-container .el-input__inner{
  303. width: 250px;
  304. }
  305. .NoiseTemplateWrapper .el-select .el-input .el-icon-circle-close{
  306. display: inherit!important;
  307. }
  308. </style>