AddQuestionModules.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. <template>
  2. <div class="NoiseTemplateWrapper TemplateWrapper">
  3. <crumbs
  4. :title="txt"
  5. class="topBack"
  6. :param="$route.params"
  7. linkTo="QuestionModules"
  8. ></crumbs>
  9. <div class="PubTagGroupWrapper">
  10. <el-form class="groups"
  11. :rules="rules"
  12. ref="groups"
  13. :model="form"
  14. label-width="150px">
  15. <el-form-item
  16. label="模板类型:"
  17. prop="moduleType">
  18. <span class="changeTips">改变类型后,填写单明细将会恢复到默认状态</span>
  19. <el-select
  20. v-model="form.moduleType"
  21. :disabled="!!editData.id"
  22. placeholder="请选择模板类型"
  23. @change="changeType(1)"
  24. >
  25. <el-option
  26. v-for="item in moduleTypes"
  27. :label="item.name"
  28. :value="item.val"
  29. :key="item.val"
  30. ></el-option>
  31. </el-select>
  32. </el-form-item>
  33. <el-form-item
  34. v-if="form.moduleType==1"
  35. label="选择科室:"
  36. prop="relationId">
  37. <span class="changeTips">改变类型后,填写单明细将会恢复到默认状态</span>
  38. <el-select
  39. v-model="form.relationId"
  40. :disabled="!!editData.id"
  41. placeholder="请选择科室"
  42. >
  43. <el-option
  44. v-for="item in deptList"
  45. :label="item.name"
  46. :value="item.conceptId+''"
  47. :key="item.conceptId+''"
  48. ></el-option>
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item
  52. label="模板归属:"
  53. prop="type"
  54. >
  55. <span class="changeTips">改变归属后,填写单明细将会恢复到默认状态</span>
  56. <el-select
  57. v-model="form.type"
  58. :clearable="false"
  59. :disabled="!!editData.id||!form.moduleType||(form.moduleType==1&&!form.relationId)"
  60. placeholder="请选择模板归属"
  61. @change="changeType(0)"
  62. >
  63. <el-option
  64. v-for="item in typeList"
  65. :label="item.name"
  66. :value="item.val"
  67. :key="item.val"
  68. ></el-option>
  69. </el-select>
  70. </el-form-item>
  71. <el-form-item
  72. label="模板名称:"
  73. prop="name"
  74. >
  75. <el-input
  76. v-model="form.name"
  77. maxLength="30"
  78. placeholder="请输入模板名称"
  79. ></el-input>
  80. </el-form-item>
  81. <el-form-item label="备注:" prop="remark">
  82. <el-input type="textarea" v-model="form.remark" style="width: 500px;"></el-input>
  83. </el-form-item>
  84. </el-form>
  85. </div>
  86. <div class="main">
  87. <p class="title" v-if="form.type&&form.moduleType">
  88. <i v-if="form.type!=1">*</i>填写单明细:
  89. </p>
  90. <QuestionTagGroup v-if="form.type&&form.moduleType&&form.type!=1" qaType="3" :ascription="form.type" :relationId="form.relationId" @changeActionData="pushValues" :options="editData.moduleDetail"></QuestionTagGroup>
  91. <div class="static" v-if="form.type==1">
  92. <p>请问您有哪些不适?</p>
  93. <div class="inner">科室常见症状</div>
  94. </div>
  95. <div class="btn">
  96. <el-button
  97. type="primary"
  98. @click="submitForm"
  99. >确 定</el-button>
  100. </div>
  101. </div>
  102. </div>
  103. </template>
  104. <script>
  105. /**
  106. *
  107. */
  108. import QuestionTagGroup from './QuestionTagGroup';
  109. import api from '@api/preTreat.js';
  110. export default {
  111. name: 'addCombinQuestion',
  112. props:[''],
  113. data() {
  114. return {
  115. txt:'模板维护-添加模板',
  116. form:{
  117. name:"",
  118. type:"",
  119. moduleType:"",
  120. relationId:"",
  121. moduleDetail:[],
  122. remark:''
  123. },
  124. typeList:[],
  125. moduleTypes:[],
  126. deptList:[],
  127. editData:{}, //编辑数据
  128. options: [], //标签明细右侧操作数据
  129. rules: {
  130. type: [
  131. { required: true, message: '请选择归属', trigger: 'change' }
  132. ],
  133. moduleType: [
  134. { required: true, message: '请选择类型', trigger: 'change' }
  135. ],
  136. name: [
  137. { required: true, message: '请输入模板名称', trigger: 'change' },
  138. { validator: (rule, value, callback)=>{
  139. if(value.length>7){
  140. callback(new Error('模板名称不能超过7个字'));
  141. }else{
  142. callback();
  143. }
  144. }, trigger: 'blur' },
  145. ],
  146. remark:[
  147. { validator: (rule, value, callback)=>{
  148. if((value&&value.trim().length>0)&&value.length>120){
  149. callback(new Error('备注不能超过120个字'));
  150. }else{
  151. callback();
  152. }
  153. }, trigger: 'blur' },
  154. ],
  155. relationId: [
  156. { required: true, message: '请选择模板归属科室', trigger: 'change' },
  157. ],
  158. },
  159. }
  160. },
  161. beforeMount:function(){
  162. const {isEdit,data} = this.$route.params;
  163. this.getDropDatas();
  164. if(isEdit){
  165. //this.getAvailibleType();
  166. this.txt = '模板维护-修改模板';
  167. this.form = Object.assign({},this.form,this.transFormData(data));
  168. this.editData = data;
  169. }
  170. },
  171. watch:{
  172. 'form.moduleType':function(newVal,oldVal){
  173. if(+newVal!==1){
  174. this.form.relationId = '';
  175. }
  176. this.getAvailibleType();
  177. },
  178. 'form.relationId':function(newVal,oldVal){
  179. this.getAvailibleType();
  180. },
  181. },
  182. methods: {
  183. getAvailibleType(){
  184. api.getModuleType({moduleType:this.form.moduleType,relationId:this.form.relationId}).then((res) =>{
  185. if(res.data.code === '0') {
  186. this.typeList = res.data.data;
  187. }else{
  188. this.warning(res.data.msg);
  189. }
  190. });
  191. },
  192. transFormData(org){
  193. const maps = {
  194. 'moduleType':'moduleType',
  195. 'moduleDetail':'moduleDetail',
  196. 'relationId':'relationId',
  197. 'type':'type',
  198. 'name':'name',
  199. 'id':'id',
  200. 'remark':'remark'
  201. };
  202. let obj = {};
  203. for(let i in org){
  204. if(maps[i]){
  205. obj[maps[i]] = typeof org[i]=='object'?org[i]:''+org[i];
  206. }
  207. }
  208. return obj;
  209. },
  210. getDropDatas(){
  211. api.getPreTypeList().then((res) =>{
  212. if(res.data.code === '0') {
  213. this.typeList = res.data.data[1];
  214. this.moduleTypes = res.data.data[4];
  215. }
  216. });
  217. this.getDeptList();
  218. },
  219. getDeptList(){
  220. const depts = localStorage.getItem("precDeptList");
  221. const list = depts?JSON.parse(depts):[];
  222. if(list&&list.length>0){
  223. this.deptList = list;
  224. return ;
  225. }
  226. api.getDeptList({moduleType:0,type:1}).then((res) =>{
  227. if(res.data.code === '0') {
  228. this.deptList = res.data.data&&res.data.data.deptDTOS||[];
  229. localStorage.setItem("precDeptList",JSON.stringify(this.deptList));
  230. }
  231. });
  232. },
  233. changeType(flag) { //填写单类型改变,标签明细左侧更新,右侧清空
  234. // console.log('type',type)
  235. if(flag){
  236. this.form.type='';
  237. }
  238. this.options = [];
  239. },
  240. pushValues(its){
  241. const arr = its.map((it)=>{
  242. return {
  243. questionId:it.id,
  244. }
  245. });
  246. this.options = arr;
  247. },
  248. submitForm() { // 调用子组件的方法验证公用部分
  249. this.$refs.groups.validate((valid) => {
  250. if (valid) {
  251. let param = this.form;
  252. param.moduleDetail = this.options;
  253. if(this.form.type!=1&&(!this.options||this.options.length==0)){
  254. this.warning('模版至少包含一个填写单');
  255. return;
  256. }
  257. this.showSaveDialog(param);
  258. }else{
  259. return false;
  260. }
  261. });
  262. },
  263. showSaveDialog(param) {
  264. this.showConfirmDialog('是否保存该模板?', () => {
  265. api.addModule(param).then((res) => {
  266. if (res.data.code === '0') {
  267. this.warning(res.data.msg || '保存成功', 'success');
  268. //返回带搜索条件的首页
  269. this.$router.push({name:'QuestionModules',params:Object.assign({},this.$route.params,{currentPage:1})});
  270. } else {
  271. this.warning(res.data.msg)
  272. }
  273. }).catch((err) => {
  274. this.warning(err);
  275. })
  276. });
  277. },
  278. showConfirmDialog(msg, resolve) {
  279. this.$alert(msg, '提示', {
  280. confirmButtonText: '确定',
  281. type: 'warning'
  282. }).then(() => {
  283. resolve();
  284. }).catch(() => {});
  285. },
  286. warning(msg, type) {
  287. this.$message({
  288. showClose: true,
  289. message: msg,
  290. type: type || 'warning'
  291. })
  292. },
  293. },
  294. components: {
  295. QuestionTagGroup
  296. }
  297. }
  298. </script>
  299. <style lang="less">
  300. @import "../../less/common.less";
  301. .NoiseTemplateWrapper .el-select .el-input__validateIcon.el-icon-circle-close{
  302. display: none!important;
  303. }
  304. .PubTagGroupWrapper .groups {
  305. padding: 20px 20px 30px;
  306. .el-form-item__error{
  307. top:unset;
  308. }
  309. }
  310. .NoiseTemplateWrapper .PubTagGroupWrapper{
  311. padding-bottom: 18px;
  312. }
  313. .static{
  314. width:360px;
  315. height:137px;
  316. background:#F0EEEE;
  317. padding: 20px 0 0 20px;
  318. .inner{
  319. background: #fff;
  320. width: 317px;
  321. height: 57px;
  322. line-height: 52px;
  323. margin-top:20px;
  324. text-align: center;
  325. }
  326. p{
  327. }
  328. }
  329. .PubTagGroupWrapper{
  330. padding-bottom: 10px;
  331. }
  332. .NoiseTemplateWrapper {
  333. .groupTitle {
  334. background-color: #fff;
  335. height: 40px;
  336. line-height: 40px;
  337. padding-left: 20px;
  338. }
  339. .main {
  340. background-color: #fff;
  341. margin: 0 20px 20px;
  342. padding: 20px;
  343. border-top: 1px solid @icssBorder;
  344. box-sizing: border-box;
  345. font-size: 14px;
  346. color: #606266;
  347. .title {
  348. margin-bottom: 20px;
  349. i {
  350. color: #f56c6c;
  351. }
  352. }
  353. }
  354. .btn {
  355. text-align: right;
  356. }
  357. .order {
  358. margin-bottom: 20px;
  359. .el-input__inner {
  360. line-height: 30px;
  361. height: 30px;
  362. }
  363. }
  364. }
  365. .toast-cancel{
  366. color: #22ccc8 !important;
  367. // background: #22ccc8;
  368. }
  369. </style>