AddQuestionModules.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. <template>
  2. <div class="NoiseTemplateWrapper TemplateWrapper">
  3. <crumbs
  4. :title="txt"
  5. class="topBack"
  6. linkTo="/admin/LT-YWZSJWH-MBWH"
  7. ></crumbs>
  8. <div class="PubTagGroupWrapper">
  9. <el-form class="groups"
  10. :rules="rules"
  11. ref="groups"
  12. :model="form"
  13. label-width="150px">
  14. <el-form-item
  15. label="模板类型:"
  16. prop="moduleType">
  17. <span class="changeTips">改变类型后,填写单明细将会恢复到默认状态</span>
  18. <el-select
  19. v-model="form.moduleType"
  20. :disabled="!!editData.id"
  21. placeholder="请选择模板类型"
  22. @change="changeType(1)"
  23. >
  24. <el-option
  25. v-for="item in moduleTypes"
  26. :label="item.name"
  27. :value="item.val"
  28. :key="item.val"
  29. ></el-option>
  30. </el-select>
  31. </el-form-item>
  32. <el-form-item
  33. v-if="form.moduleType==1"
  34. label="选择科室:"
  35. prop="relationId">
  36. <span class="changeTips">改变类型后,填写单明细将会恢复到默认状态</span>
  37. <el-select
  38. v-model="form.relationId"
  39. :disabled="!!editData.id"
  40. placeholder="请选择科室"
  41. >
  42. <el-option
  43. v-for="item in deptList"
  44. :label="item.name"
  45. :value="item.conceptId+''"
  46. :key="item.conceptId+''"
  47. ></el-option>
  48. </el-select>
  49. </el-form-item>
  50. <el-form-item
  51. label="模板归属:"
  52. prop="type"
  53. >
  54. <span class="changeTips">改变归属后,填写单明细将会恢复到默认状态</span>
  55. <el-select
  56. v-model="form.type"
  57. :clearable="false"
  58. :disabled="!!editData.id||!form.moduleType||(form.moduleType==1&&!form.relationId)"
  59. placeholder="请选择模板归属"
  60. @change="changeType(0)"
  61. >
  62. <el-option
  63. v-for="item in typeList"
  64. :label="item.name"
  65. :value="item.val"
  66. :key="item.val"
  67. ></el-option>
  68. </el-select>
  69. </el-form-item>
  70. <el-form-item
  71. label="模板名称:"
  72. prop="name"
  73. >
  74. <el-input
  75. v-model="form.name"
  76. maxLength="30"
  77. placeholder="请输入模板名称"
  78. ></el-input>
  79. </el-form-item>
  80. <el-form-item label="备注:" prop="remark">
  81. <el-input type="textarea" v-model="form.remark" style="width: 500px;"></el-input>
  82. </el-form-item>
  83. </el-form>
  84. </div>
  85. <div class="main">
  86. <p class="title" v-if="form.type&&form.moduleType">
  87. <i v-if="form.type!=1">*</i>填写单明细:
  88. </p>
  89. <QuestionTagGroup v-if="form.type&&form.moduleType&&form.type!=1" qaType="3" :ascription="form.type" :relationId="form.relationId" @changeActionData="pushValues" :options="editData.moduleDetail"></QuestionTagGroup>
  90. <div class="static" v-if="form.type==1">
  91. <p>请问您有哪些不适?</p>
  92. <div class="inner">科室常见症状</div>
  93. </div>
  94. <div class="btn">
  95. <el-button
  96. type="primary"
  97. @click="submitForm"
  98. >确 定</el-button>
  99. </div>
  100. </div>
  101. </div>
  102. </template>
  103. <script>
  104. /**
  105. *
  106. */
  107. import QuestionTagGroup from './QuestionTagGroup';
  108. import api from '@api/preTreat.js';
  109. export default {
  110. name: 'addCombinQuestion',
  111. props:[''],
  112. data() {
  113. return {
  114. txt:'模板维护-添加模板',
  115. form:{
  116. name:"",
  117. type:"",
  118. moduleType:"",
  119. relationId:"",
  120. moduleDetail:[],
  121. remark:''
  122. },
  123. typeList:[],
  124. moduleTypes:[],
  125. deptList:[],
  126. editData:{}, //编辑数据
  127. options: [], //标签明细右侧操作数据
  128. rules: {
  129. type: [
  130. { required: true, message: '请选择归属', trigger: 'change' }
  131. ],
  132. moduleType: [
  133. { required: true, message: '请选择类型', trigger: 'change' }
  134. ],
  135. name: [
  136. { required: true, message: '请输入模板名称', trigger: 'change' },
  137. { validator: (rule, value, callback)=>{
  138. if(value.length>7){
  139. callback(new Error('模板名称不能超过7个字'));
  140. }else{
  141. callback();
  142. }
  143. }, trigger: 'blur' },
  144. ],
  145. remark:[
  146. { validator: (rule, value, callback)=>{
  147. if((value&&value.trim().length>0)&&value.length>120){
  148. callback(new Error('备注不能超过120个字'));
  149. }else{
  150. callback();
  151. }
  152. }, trigger: 'blur' },
  153. ],
  154. relationId: [
  155. { required: true, message: '请选择模板归属科室', trigger: 'change' },
  156. ],
  157. },
  158. }
  159. },
  160. beforeMount:function(){
  161. const {isEdit,data} = this.$route.params;
  162. this.getDropDatas();
  163. if(isEdit){
  164. //this.getAvailibleType();
  165. this.txt = '模板维护-修改模板';
  166. this.form = Object.assign({},this.form,this.transFormData(data));
  167. this.editData = data;
  168. }
  169. },
  170. watch:{
  171. 'form.moduleType':function(newVal,oldVal){
  172. if(+newVal!==1){
  173. this.form.relationId = '';
  174. }
  175. this.getAvailibleType();
  176. },
  177. 'form.relationId':function(newVal,oldVal){
  178. this.getAvailibleType();
  179. },
  180. },
  181. methods: {
  182. back() { this.$router.go(-1) },
  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. this.$router.push("/admin/LT-YWZSJWH-MBWH");
  269. } else {
  270. this.warning(res.data.msg)
  271. }
  272. }).catch((err) => {
  273. this.warning(err);
  274. })
  275. });
  276. },
  277. showConfirmDialog(msg, resolve) {
  278. this.$alert(msg, '提示', {
  279. confirmButtonText: '确定',
  280. type: 'warning'
  281. }).then(() => {
  282. resolve();
  283. }).catch(() => {});
  284. },
  285. warning(msg, type) {
  286. this.$message({
  287. showClose: true,
  288. message: msg,
  289. type: type || 'warning'
  290. })
  291. },
  292. },
  293. components: {
  294. QuestionTagGroup
  295. }
  296. }
  297. </script>
  298. <style lang="less">
  299. @import "../../less/common.less";
  300. .NoiseTemplateWrapper .el-select .el-input__validateIcon.el-icon-circle-close{
  301. display: none!important;
  302. }
  303. .PubTagGroupWrapper .groups {
  304. padding: 20px 20px 30px;
  305. .el-form-item__error{
  306. top:unset;
  307. }
  308. }
  309. .NoiseTemplateWrapper .PubTagGroupWrapper{
  310. padding-bottom: 18px;
  311. }
  312. .static{
  313. width:360px;
  314. height:137px;
  315. background:#F0EEEE;
  316. padding: 20px 0 0 20px;
  317. .inner{
  318. background: #fff;
  319. width: 317px;
  320. height: 57px;
  321. line-height: 52px;
  322. margin-top:20px;
  323. text-align: center;
  324. }
  325. p{
  326. }
  327. }
  328. .PubTagGroupWrapper{
  329. padding-bottom: 10px;
  330. }
  331. .NoiseTemplateWrapper {
  332. .groupTitle {
  333. background-color: #fff;
  334. height: 40px;
  335. line-height: 40px;
  336. padding-left: 20px;
  337. }
  338. .main {
  339. background-color: #fff;
  340. margin: 0 20px 20px;
  341. padding: 20px;
  342. border-top: 1px solid @icssBorder;
  343. box-sizing: border-box;
  344. font-size: 14px;
  345. color: #606266;
  346. .title {
  347. margin-bottom: 20px;
  348. i {
  349. color: #f56c6c;
  350. }
  351. }
  352. }
  353. .btn {
  354. text-align: right;
  355. }
  356. .order {
  357. margin-bottom: 20px;
  358. .el-input__inner {
  359. line-height: 30px;
  360. height: 30px;
  361. }
  362. }
  363. }
  364. .toast-cancel{
  365. color: #22ccc8 !important;
  366. // background: #22ccc8;
  367. }
  368. </style>