InnerSurvey.vue 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232
  1. <style lang="scss" scoped>
  2. .preview {
  3. .el-form-item {
  4. margin-bottom: 15px;
  5. }
  6. label,
  7. p {
  8. line-height: 25px !important;
  9. }
  10. }
  11. .el-cascader {
  12. width: 100%;
  13. }
  14. a {
  15. text-decoration: none;
  16. color: #409eff;
  17. cursor: pointer;
  18. }
  19. // 右边
  20. .item-main {
  21. // margin:34px;
  22. // height:600px;
  23. background: #ffffff;
  24. width: 356px;
  25. height: 575px;
  26. overflow: auto;
  27. // border: 1px solid #ddd;
  28. // display: none;
  29. position: relative;
  30. top: 24px;
  31. left: 4px;
  32. // box-shadow: 0px 5px 10px 0px rgba(0, 0, 0, 0.13);
  33. border-radius: 5px;
  34. border: 1px solid #ccc;
  35. .el-form.over_y {
  36. max-height: calc(100vh - 340px);
  37. overflow: visible;
  38. }
  39. .tpl_form {
  40. border: none;
  41. }
  42. /deep/.el-form-item__label {
  43. float: none;
  44. font-weight: 600;
  45. }
  46. }
  47. // label样式
  48. .edit_label {
  49. /deep/.el-input__inner {
  50. background: #f5faff;
  51. border: 0px;
  52. padding: 0px;
  53. }
  54. }
  55. /deep/.opicon {
  56. font-weight: bold;
  57. padding: 5px;
  58. color: #3895fe;
  59. }
  60. .tpl_title {
  61. font-size: 18px;
  62. width: 80%;
  63. margin: 20px auto;
  64. }
  65. .tpl_form {
  66. // margin: 20px;
  67. border: 1px solid #ccc;
  68. border-radius: 20px;
  69. /deep/.el-form-item {
  70. background: none;
  71. padding: 10px 20px;
  72. }
  73. /deep/.el-form-item__label {
  74. float: none;
  75. font-weight: 600;
  76. display: block;
  77. line-height: 20px;
  78. margin-bottom: 10px;
  79. text-align: left;
  80. }
  81. /deep/.el-form-item__content {
  82. line-height: 20px!important;
  83. width: 100%;
  84. .el-radio-group,
  85. .el-checkbox-group {
  86. display: flex;
  87. flex-direction: column;
  88. }
  89. .cus_select .el-radio {
  90. line-height: 20px;
  91. }
  92. .cus_select .el-checkbox {
  93. line-height: 20px;
  94. }
  95. .cus_select .el-radio,
  96. .el-radio__input {
  97. white-space: normal;
  98. }
  99. .cus_select .el-checkbox,
  100. .el-checkbox__input {
  101. white-space: normal;
  102. }
  103. .cus_select .el-checkbox__label {
  104. display: inline;
  105. }
  106. .el-radio__label,
  107. .el-checkbox__label {
  108. display: inline-block !important;
  109. width: 93%;
  110. vertical-align: top;
  111. }
  112. .el-radio,
  113. .el-checkbox {
  114. margin-bottom: 10px;
  115. margin-right: 1px;
  116. }
  117. }
  118. }
  119. .survey_logo {
  120. width: 143px;
  121. position: relative;
  122. top: 15px;
  123. left: 20px;
  124. }
  125. .result_dialog .el-dialog {
  126. width: 40%;
  127. margin-top: 20vh !important;
  128. }
  129. .result-item {
  130. height: 35px;
  131. .label {
  132. font-weight: 600;
  133. }
  134. }
  135. .qrcode_dialog {
  136. /deep/.el-dialog {
  137. width: 20%;
  138. }
  139. img {
  140. width: 100%;
  141. }
  142. }
  143. .survey_dialog {
  144. /deep/.el-dialog {
  145. // width:25%;
  146. width: 400px;
  147. height: 750px;
  148. margin-top: 20px !important;
  149. background: url("../../assets/survey_bg.png") no-repeat;
  150. background-size: 100% 100%;
  151. border-radius: 60px;
  152. }
  153. }
  154. .message_desc {
  155. width: 80%;
  156. margin: auto;
  157. text-indent: 25px;
  158. color: #1c388c;
  159. font-size: 14px;
  160. }
  161. // 批注信息
  162. .tool_text {
  163. width: 315px;
  164. p {
  165. margin-bottom: 10px;
  166. }
  167. .toolText_img {
  168. img {
  169. width: 100px;
  170. height: 100px;
  171. margin-bottom: 5px;
  172. }
  173. img:nth-child(odd) {
  174. margin-right: 5px;
  175. }
  176. }
  177. }
  178. .group_title {
  179. font-size: 16px;
  180. font-weight: bold;
  181. padding: 10px 20px;
  182. }
  183. .groupMain {
  184. border: 1px solid #ccc;
  185. border-radius: 5px;
  186. margin:20px;
  187. }
  188. // .require::before {
  189. // content: "*";
  190. // color: #f56c6c;
  191. // margin-right: 4px;
  192. // position: absolute;
  193. // left: -10px;
  194. // }
  195. </style>
  196. <template>
  197. <section>
  198. <p><span>信息管理></span>内部问卷</p>
  199. <div class="content">
  200. <div class="filter">
  201. <el-form
  202. size="small"
  203. label-width="70px"
  204. :inline="true"
  205. label-position="left"
  206. >
  207. <el-form-item label="">
  208. <el-input
  209. clearable
  210. placeholder="请输入标题"
  211. v-model="form.name"
  212. @clear="getData"
  213. @keyup.enter.native="search"
  214. ></el-input>
  215. </el-form-item>
  216. <el-form-item>
  217. <el-button type="primary" @click="search">搜索</el-button>
  218. </el-form-item>
  219. <el-form-item style="float: right">
  220. <el-button @click="openDiag" type="primary">新建内部问卷</el-button>
  221. </el-form-item>
  222. </el-form>
  223. </div>
  224. <el-table
  225. class="table"
  226. :data="list"
  227. height="50vh"
  228. border
  229. v-loading="loading"
  230. default-expand-all
  231. row-key="id"
  232. style="width: 100%"
  233. >
  234. <el-table-column prop="name" label="标题"> </el-table-column>
  235. <!-- <el-table-column prop="name" label="附件">
  236. <template slot-scope="scope">
  237. <a :href="scope.row.fileurl" target="_blank"
  238. ><span>{{ scope.row.filename }}</span></a
  239. >
  240. </template>
  241. </el-table-column> -->
  242. <el-table-column prop="cname" label="问卷预览">
  243. <template slot-scope="scope">
  244. <a @click="showSurvey(scope.row)" target="_blank"
  245. ><span>查看问卷</span></a
  246. >
  247. <a v-if="scope.row.template_qrcode" @click="showQrcode(scope.row)"
  248. ><span> | 生成二维码</span></a
  249. >
  250. </template>
  251. </el-table-column>
  252. <el-table-column prop="dwz_url" label="问卷地址">
  253. <template slot-scope="scope">
  254. <a :href="scope.row.dwz_url" target="_blank"
  255. ><span>{{scope.row.dwz_url}}</span></a
  256. >
  257. </template>
  258. </el-table-column>
  259. <el-table-column prop="cname" label="填报统计">
  260. <template slot-scope="scope">
  261. <span v-if="scope.row.receiver_ids"
  262. >共统计:
  263. <a target="_blank" @click="analyseData('total', scope.row.id)"
  264. ><span>{{
  265. scope.row.receiver_ids ? scope.row.receiver_ids.length : 0
  266. }}</span></a
  267. >人<br />
  268. </span>
  269. 已填报:<a
  270. :href="scope.row.fileurl"
  271. target="_blank"
  272. @click="analyseData('finish', scope.row.id)"
  273. ><span>{{
  274. scope.row.finish_ids ? scope.row.finish_ids.length : 0
  275. }}</span></a
  276. >人<br />
  277. <span v-if="scope.row.receiver_ids">
  278. 未填报:<a
  279. :href="scope.row.fileurl"
  280. target="_blank"
  281. @click="analyseData('unfinish', scope.row.id)"
  282. ><span>{{ scope.row.unfinish_ids.length }}</span></a
  283. >人<br
  284. /></span>
  285. </template>
  286. </el-table-column>
  287. <el-table-column prop="cname" label="问卷统计" width="80px">
  288. <template slot-scope="scope">
  289. <a @click="showMessageAnalyse(scope.row)">查看</a>
  290. </template>
  291. </el-table-column>
  292. <el-table-column prop="cname" label="发送者" width="80px">
  293. </el-table-column>
  294. <!-- <el-table-column prop="receiver_names" label="接收者"> -->
  295. <!-- </el-table-column> -->
  296. <el-table-column prop="ctime" label="发送时间" width="180px">
  297. </el-table-column>
  298. <el-table-column prop="zip" width="150" label="操作">
  299. <template slot-scope="scope">
  300. <el-button
  301. :class="scope.row.status == 1 ? 'close' : 'open'"
  302. type="text"
  303. @click="switchStatus(scope.row)"
  304. >{{ scope.row.status == 1 ? "禁用" : "启用" }}</el-button
  305. >
  306. <el-button class="edit" type="text" @click="edit(scope.row)"
  307. >编辑</el-button
  308. >
  309. <el-button
  310. v-if="scope.row.status == 0"
  311. class="del"
  312. @click="del(scope.row.id)"
  313. type="text"
  314. >删除</el-button
  315. >
  316. </template>
  317. </el-table-column>
  318. </el-table>
  319. <Page
  320. ref="pageButton"
  321. :current="form.page"
  322. :page_size="form.page_size"
  323. :total="total"
  324. @pageChange="gopage"
  325. />
  326. </div>
  327. <el-dialog
  328. :title="dialogTitle"
  329. :close-on-click-modal="false"
  330. :visible.sync="dialogVisible"
  331. >
  332. <el-form
  333. size="small"
  334. class="preview"
  335. :inline="false"
  336. label-width="80px"
  337. :model="form1"
  338. ref="form1"
  339. :rules="rules"
  340. >
  341. <el-form-item label="标题" prop="name">
  342. <el-input
  343. v-model="form1.name"
  344. placeholder="请输入标题"
  345. maxlength="45"
  346. show-word-limit
  347. ></el-input>
  348. </el-form-item>
  349. <el-form-item label="发布单位" prop="publisher">
  350. <el-input
  351. v-model="form1.publisher"
  352. placeholder="请输入发布单位"
  353. maxlength="30"
  354. show-word-limit
  355. ></el-input>
  356. </el-form-item>
  357. <el-form-item label="问卷描述">
  358. <el-input
  359. type="textarea"
  360. v-model="form1.desc"
  361. placeholder="请输入问卷描述"
  362. ></el-input>
  363. </el-form-item>
  364. <el-form-item label="接收人" prop="receiver_id">
  365. <el-cascader
  366. v-model="form1.receiver_id"
  367. :options="options"
  368. :props="props"
  369. @change="handleChange"
  370. clearable
  371. >
  372. <template slot-scope="{ node, data }">
  373. <span>{{ data.label }}</span>
  374. <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
  375. </template>
  376. </el-cascader>
  377. </el-form-item>
  378. <el-form-item label="问卷模板" prop="template_id">
  379. <el-select
  380. placeholder="请选择问卷模板"
  381. v-model="form1.template_id"
  382. :disabled="form1.edit"
  383. clearable
  384. >
  385. <el-option
  386. v-for="(item, index) in templateList"
  387. :key="index"
  388. :label="item.name"
  389. :value="item.id"
  390. ></el-option>
  391. </el-select>
  392. </el-form-item>
  393. <!-- <el-form-item label="附件">
  394. <input @change="upload('fileurl')" id="fileurl" type="file" />
  395. <a :href="form1.fileurl" target="_blank"
  396. ><span>{{ form1.filename }}</span></a
  397. >
  398. </el-form-item> -->
  399. </el-form>
  400. <span slot="footer" class="dialog-footer">
  401. <el-button size="small" type="primary" @click="save">确 定</el-button>
  402. </span>
  403. </el-dialog>
  404. <!-- 问卷调查表单 -->
  405. <el-dialog
  406. close-on-click-modal
  407. :show-close="false"
  408. :visible.sync="dialogVisible1"
  409. class="survey_dialog"
  410. width="400px"
  411. >
  412. <div class="item-main">
  413. <!-- <img src="../../assets/survey_logo.png" alt="" class="survey_logo" /> -->
  414. <h5 align="center" class="tpl_title">{{ title }}</h5>
  415. <div class="message_desc">{{ messageData.desc }}</div>
  416. <el-form
  417. ref="form2"
  418. :model="form2"
  419. class="tpl_form over_y"
  420. :rules="rules1.rules"
  421. >
  422. <template v-for="(item, index) in widgetList">
  423. <el-form-item
  424. :key="index"
  425. :label="index+1+'、'+item.label + item.cntype"
  426. :prop="item.label"
  427. v-if="item.type != 'group'"
  428. >
  429. <span style="color:#409eff;font-size:12px;">{{item.noteDesc}}</span>
  430. <el-tooltip
  431. class="item"
  432. effect="dark"
  433. content="Left Bottom 提示文字"
  434. placement="bottom-end"
  435. >
  436. <i
  437. v-if="item.noteDesc || item.noteImgs"
  438. class="el-icon-info"
  439. style="position: absolute; top: -28px; right: 0px"
  440. ></i>
  441. <div slot="content" class="tool_text">
  442. <p>{{ item.noteDesc }}</p>
  443. <div class="toolText_img">
  444. <img
  445. :src="item"
  446. alt=""
  447. v-for="(item, index) in item.noteImgs"
  448. :key="index"
  449. />
  450. </div>
  451. </div>
  452. </el-tooltip>
  453. <el-input
  454. v-if="item.type == 'input'"
  455. v-model="form2[item.label]"
  456. :placeholder="item.placeholder"
  457. ></el-input>
  458. <el-input
  459. v-if="item.type == 'textarea'"
  460. type="textarea"
  461. :rows="4"
  462. v-model="form2[item.label]"
  463. :placeholder="item.placeholder"
  464. ></el-input>
  465. <el-radio-group
  466. v-if="item.type == 'radio'"
  467. v-model="form2[item.label]"
  468. class="cus_select"
  469. >
  470. <el-radio
  471. :label="iitem.label"
  472. v-for="(iitem, index) in item.items"
  473. :key="index"
  474. >{{ iitem.label }}</el-radio
  475. >
  476. </el-radio-group>
  477. <el-checkbox-group
  478. v-else-if="item.type == 'checkbox'"
  479. v-model="form2[item.label]"
  480. class="cus_select"
  481. >
  482. <el-checkbox
  483. :label="iitem.label"
  484. v-for="(iitem, index) in item.items"
  485. :key="index"
  486. ></el-checkbox>
  487. </el-checkbox-group>
  488. <el-upload
  489. v-if="item.type == 'image'"
  490. action="/api/admin/uploadfile"
  491. list-type="picture-card"
  492. :data="{ type: item.label }"
  493. :on-success="(value)=> imageChange(item.label, value)"
  494. :on-remove="(file,filelist)=> handleRemove(item.label, file,filelist)"
  495. >
  496. <i class="el-icon-plus"></i>
  497. </el-upload>
  498. <el-upload
  499. v-if="item.type == 'file'"
  500. class="upload-demo"
  501. ref="upload"
  502. action="/api/admin/uploadfile"
  503. :data="{ type: item.label }"
  504. :on-success="(value)=> imageChange(item.label, value)"
  505. :on-remove="(file,filelist)=> handleRemove(item.label, file,filelist)"
  506. >
  507. <!-- <el-button slot="trigger" size="small" type="primary">选取文件</el-button> -->
  508. <el-button
  509. style="margin-left: 10px"
  510. size="small"
  511. type="primary"
  512. plain
  513. >添加文件</el-button
  514. >
  515. <!-- <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> -->
  516. </el-upload>
  517. </el-form-item>
  518. <!-- 域组件展示 -->
  519. <section
  520. class="groupMain"
  521. v-if="item.type == 'group'"
  522. :key="'review_gi' + index"
  523. >
  524. <h6
  525. v-if="item.type == 'group'"
  526. align="left"
  527. class="group_title"
  528. :key="'revire_g' + index"
  529. >
  530. {{ item.label }}
  531. </h6>
  532. <template v-for="(iitem, index) in item.children">
  533. <el-form-item
  534. :prop="iitem.label + '(' + item.label + ')'"
  535. :key="'review_gc' + index"
  536. :label="iitem.label + iitem.cntype"
  537. >
  538. <span style="color:#409eff;font-size:12px;">{{iitem.noteDesc}}</span>
  539. <el-tooltip
  540. class="item"
  541. effect="dark"
  542. content="Left Bottom 提示文字"
  543. placement="bottom-end"
  544. >
  545. <i
  546. v-if="iitem.noteDesc || iitem.noteImgs"
  547. class="el-icon-info"
  548. style="position: absolute; top: -28px; right: 0px"
  549. ></i>
  550. <div slot="content" class="tool_text">
  551. <p>{{ iitem.noteDesc }}</p>
  552. <div class="toolText_img">
  553. <img
  554. :src="iitem"
  555. alt=""
  556. v-for="(iitem, index) in iitem.noteImgs"
  557. :key="'review_gc_noteimgs' + index"
  558. />
  559. </div>
  560. </div>
  561. </el-tooltip>
  562. <el-input
  563. :class="iitem.require ? 'require' : ''"
  564. v-if="iitem.type == 'input'"
  565. v-model="form2[iitem.label + '(' + item.label + ')']"
  566. :placeholder="iitem.placeholder"
  567. ></el-input>
  568. <el-input
  569. :class="iitem.require ? 'require' : ''"
  570. v-if="iitem.type == 'textarea'"
  571. type="textarea"
  572. v-model="form2[iitem.label + '(' + item.label + ')']"
  573. :placeholder="iitem.placeholder"
  574. ></el-input>
  575. <el-radio-group
  576. class="cus_select"
  577. v-if="iitem.type == 'radio'"
  578. v-model="form2[iitem.label + '(' + item.label + ')']"
  579. :class="iitem.require ? 'require' : ''"
  580. >
  581. <el-radio
  582. :label="iiitem.label"
  583. v-for="(iiitem, index) in iitem.items"
  584. :key="'review_gcr' + index"
  585. >{{ iiitem.label }}</el-radio
  586. >
  587. </el-radio-group>
  588. <el-checkbox-group
  589. class="cus_select"
  590. v-if="iitem.type == 'checkbox'"
  591. v-model="form2[iitem.label + '(' + item.label + ')']"
  592. :class="iitem.require ? 'require' : ''"
  593. >
  594. <el-checkbox
  595. :label="iiitem.label"
  596. v-for="(iiitem, index) in iitem.items"
  597. :key="'review_gcc' + index"
  598. >{{ iiitem.label }}</el-checkbox
  599. >
  600. </el-checkbox-group>
  601. <el-upload
  602. :class="iitem.require ? 'require' : ''"
  603. v-if="iitem.type == 'image'"
  604. action="/api/admin/uploadfile"
  605. list-type="picture-card"
  606. :on-remove="(file,filelist)=> handleRemove(iitem.label + '(' + item.label + ')', file,filelist)"
  607. :on-success="(value)=> imageChange(iitem.label + '(' + item.label + ')', value)"
  608. >
  609. <i class="el-icon-plus"></i>
  610. </el-upload>
  611. <el-upload
  612. v-if="iitem.type == 'file'"
  613. class="upload-demo"
  614. ref="upload"
  615. action="/api/admin/uploadfile"
  616. :on-remove="(file,filelist)=> handleRemove(iitem.label + '(' + item.label + ')', file,filelist)"
  617. :on-success="(value)=> imageChange(iitem.label + '(' + item.label + ')', value)"
  618. :file-list="fileList"
  619. :auto-upload="false"
  620. >
  621. <!-- <el-button slot="trigger" size="small" type="primary">选取文件</el-button> -->
  622. <el-button
  623. style="margin-left: 10px"
  624. size="small"
  625. type="primary"
  626. plain
  627. @click="submitUpload"
  628. >添加文件</el-button
  629. >
  630. <!-- <div slot="tip" class="el-upload__tip">只能上传jpg/png文件,且不超过500kb</div> -->
  631. </el-upload>
  632. </el-form-item>
  633. </template>
  634. </section>
  635. <!-- 域组件end -->
  636. </template>
  637. <el-form-item v-if="this.widgetList.length">
  638. <el-button
  639. size="medium"
  640. type="primary"
  641. @click="saveResult"
  642. style="width: 100%"
  643. :disabled="form2.status == 0"
  644. >{{ this.form2.status == 1 ? "提交" : "该问卷已禁用" }}</el-button
  645. >
  646. </el-form-item>
  647. </el-form>
  648. </div>
  649. </el-dialog>
  650. <!-- 数据统计分析 -->
  651. <el-dialog
  652. :title="dialogTitle2"
  653. :close-on-click-modal="false"
  654. :visible.sync="dialogVisible2"
  655. >
  656. <div class="content">
  657. <div class="filter">
  658. <el-form
  659. size="small"
  660. label-width="70px"
  661. :inline="true"
  662. label-position="left"
  663. >
  664. <el-form-item label="">
  665. <el-input
  666. clearable
  667. placeholder="请输入标题"
  668. v-model="form1.name"
  669. @clear="search1"
  670. @keyup.enter.native="search1"
  671. ></el-input>
  672. </el-form-item>
  673. <el-form-item>
  674. <el-button type="primary" @click="search1">搜索</el-button>
  675. </el-form-item>
  676. <el-form-item style="float: right">
  677. <el-button type="primary" @click="downloadExcel"
  678. >导出Excel</el-button
  679. >
  680. </el-form-item>
  681. </el-form>
  682. </div>
  683. <el-table
  684. class="table"
  685. :data="analyseDataList"
  686. height="50vh"
  687. border
  688. v-loading="loading"
  689. default-expand-all
  690. row-key="id"
  691. style="width: 100%"
  692. >
  693. <el-table-column prop="realname" label="姓名"> </el-table-column>
  694. <el-table-column
  695. prop="journal_name"
  696. label="所属期刊"
  697. ></el-table-column>
  698. <el-table-column prop="cname" label="状态">
  699. <template slot-scope="scope">
  700. <span v-if="scope.row.post_status">已填报</span>
  701. <span v-else>未填报</span>
  702. </template>
  703. </el-table-column>
  704. <el-table-column prop="post_time" label="填报时间"> </el-table-column>
  705. <el-table-column prop="zip" width="80" label="操作">
  706. <template slot-scope="scope">
  707. <el-button
  708. class="edit"
  709. type="text"
  710. @click="showPostResult(scope.row)"
  711. >查看</el-button
  712. >
  713. </template>
  714. </el-table-column>
  715. </el-table>
  716. <Page
  717. ref="pageButton"
  718. :current="form.page"
  719. :page_size="form.page_size"
  720. :total="total"
  721. @pageChange="gopage"
  722. />
  723. </div>
  724. </el-dialog>
  725. <!-- 展示填报结果 -->
  726. <el-dialog
  727. :title="dialogTitle3"
  728. :close-on-click-modal="false"
  729. :visible.sync="dialogVisible3"
  730. class="result_dialog"
  731. >
  732. <div class="content">
  733. <div
  734. class="result-item"
  735. v-for="(item, key) in this.postResult"
  736. :key="key"
  737. >
  738. <span class="label">{{ key }}:</span
  739. ><span class="value">{{ item }}</span>
  740. </div>
  741. <div v-if="Object.keys(postResult).length == 0">暂无数据</div>
  742. </div>
  743. </el-dialog>
  744. <!-- 展示二维码 -->
  745. <el-dialog
  746. :title="dialogTitle4"
  747. :close-on-click-modal="false"
  748. :visible.sync="dialogVisible4"
  749. class="qrcode_dialog"
  750. >
  751. <div class="content">
  752. <img :src="qrcodeUrl" alt="" width="540px" />
  753. </div>
  754. </el-dialog>
  755. </section>
  756. </template>
  757. <script>
  758. import Page from "../../components/Page";
  759. export default {
  760. components: {
  761. Page,
  762. },
  763. data() {
  764. return {
  765. // checked: [],
  766. messageData: {},
  767. rules1: {
  768. rules: {},
  769. },
  770. qrcodeUrl: "",
  771. cur_message_id: null,
  772. cur_post_type: null,
  773. postResult: {},
  774. analyseDataList: [],
  775. title: "",
  776. widgetList: [],
  777. form: { name: "", page: 1, page_size: 20 },
  778. form1: {},
  779. form2: {},
  780. total: 1,
  781. list: [],
  782. loading: false,
  783. input: "",
  784. dialogVisible: false,
  785. dialogVisible1: false,
  786. dialogVisible2: false,
  787. dialogVisible3: false,
  788. dialogVisible4: false,
  789. dialogTitle: "",
  790. dialogTitle2: "",
  791. dialogTitle3: "",
  792. dialogTitle4: "",
  793. defaultProps: {},
  794. data: [],
  795. templateList: [],
  796. userList: [],
  797. checkList: [],
  798. rules: {
  799. name: [{ required: true, message: "请输入标题", trigger: "blur" }],
  800. receiver_id: [
  801. { required: true, message: "请选择接收人", trigger: "change" },
  802. ],
  803. template_id: [
  804. { required: true, message: "请选择模板", trigger: "change" },
  805. ],
  806. },
  807. props: { multiple: true },
  808. options: [
  809. {
  810. value: 1,
  811. label: "东南",
  812. children: [
  813. {
  814. value: 2,
  815. label: "上海",
  816. children: [
  817. { value: 3, label: "普陀" },
  818. { value: 4, label: "黄埔" },
  819. { value: 5, label: "徐汇" },
  820. ],
  821. },
  822. {
  823. value: 7,
  824. label: "江苏",
  825. children: [
  826. { value: 8, label: "南京" },
  827. { value: 9, label: "苏州" },
  828. { value: 10, label: "无锡" },
  829. ],
  830. },
  831. {
  832. value: 12,
  833. label: "浙江",
  834. children: [
  835. { value: 13, label: "杭州" },
  836. { value: 14, label: "宁波" },
  837. { value: 15, label: "嘉兴" },
  838. ],
  839. },
  840. ],
  841. },
  842. {
  843. value: 17,
  844. label: "西北",
  845. children: [
  846. {
  847. value: 18,
  848. label: "陕西",
  849. children: [
  850. { value: 19, label: "西安" },
  851. { value: 20, label: "延安" },
  852. ],
  853. },
  854. {
  855. value: 21,
  856. label: "新疆维吾尔族自治区",
  857. children: [
  858. { value: 22, label: "乌鲁木齐" },
  859. { value: 23, label: "克拉玛依" },
  860. ],
  861. },
  862. ],
  863. },
  864. ],
  865. };
  866. },
  867. methods: {
  868. handleRemove(label,file,filelist){
  869. let imgs=[];
  870. for(let i=0;i<filelist.length;i++){
  871. imgs.push(filelist[i].response.data)
  872. }
  873. this.form2[label]=imgs
  874. },
  875. imageChange(label,data){
  876. console.log(label,data)
  877. this.form2[label].push(data.data)
  878. },
  879. switchStatus(row) {
  880. if (row.status == 1) {
  881. this.$confirm("确定禁用吗?", "提示", {
  882. type: "warning",
  883. }).then(() => {
  884. this.$api.editMessageStatus({ id: row.id }).then((res) => {
  885. row.status = res.data.data;
  886. });
  887. });
  888. } else {
  889. this.$api.editMessageStatus({ id: row.id }).then((res) => {
  890. row.status = res.data.data;
  891. });
  892. }
  893. },
  894. showQrcode(row) {
  895. this.dialogTitle4 = "生成二维码";
  896. this.dialogVisible4 = true;
  897. this.qrcodeUrl = row.template_qrcode;
  898. },
  899. showMessageAnalyse(row) {
  900. if (row.finish_ids.length) {
  901. this.$router.push({
  902. path: "/message/innerSurvey/analyse",
  903. query: { id: row.id, type: row.type },
  904. });
  905. } else {
  906. this.$message({ message: "暂无人员填报" });
  907. }
  908. },
  909. downloadExcel() {
  910. this.$api
  911. .downloadSurveyResult({
  912. message_id: this.cur_message_id,
  913. type: this.cur_post_type,
  914. })
  915. .then((res) => {
  916. var elink = document.createElement("a");
  917. let blob = new Blob([res.data], {
  918. type: "application/vnd.ms-excel,charset=UTF-8",
  919. });
  920. let objUrl = URL.createObjectURL(blob);
  921. let file_name = decodeURIComponent(
  922. res.headers["content-disposition"].split("=")[1]
  923. );
  924. console.log(file_name);
  925. elink.download = file_name;
  926. elink.style.display = "none";
  927. elink.href = objUrl;
  928. document.body.appendChild(elink);
  929. elink.click();
  930. document.body.removeChild(elink);
  931. this.download_loading = false;
  932. });
  933. },
  934. showPostResult(row) {
  935. this.postResult = row.post_result;
  936. this.dialogTitle3 = "填报结果";
  937. this.dialogVisible3 = true;
  938. },
  939. analyseData(type, message_id) {
  940. this.form1 = {};
  941. let parm = this.form1;
  942. parm.type = type;
  943. parm.message_id = message_id;
  944. this.dialogTitle2 = "统计结果";
  945. this.dialogVisible2 = true;
  946. this.$api.getMessageSurveyAnalyse(parm).then((res) => {
  947. this.analyseDataList = res.data.data.list;
  948. this.cur_message_id = message_id;
  949. this.cur_post_type = type;
  950. });
  951. },
  952. handleSuccess(res, file) {
  953. this.form2[res.data.type] = res.data.url;
  954. },
  955. change(i, label) {
  956. this.form2[label] = i;
  957. },
  958. changeMul(i, label) {
  959. this.form2[label] = i;
  960. },
  961. showSurvey(row) {
  962. let _this = this;
  963. this.title = row.name;
  964. this.message_id = row.id;
  965. this.widgetList = [];
  966. this.form2 = {};
  967. this.form2.status = row.status;
  968. this.$api.getMessageInfo({ id: row.id }).then((res) => {
  969. if (res.data.code == 0) {
  970. this.messageData = res.data.data;
  971. this.widgetList = res.data.data.widget;
  972. let rules1 = {};
  973. this.widgetList.forEach((i) => {
  974. if (i.type == "checkbox"||i.type == "image") {
  975. // _this.form2[i.label] = [] ;
  976. if (i.result) {
  977. _this.$set(_this.form2, i.label, i.result);
  978. } else {
  979. _this.$set(_this.form2, i.label, []);
  980. }
  981. } else {
  982. _this.$set(_this.form2, i.label, i.result);
  983. }
  984. //组装rules
  985. if (i.type == "input" && i.require) {
  986. rules1[i.label] = [
  987. { required: true, message: i.placeholder, trigger: "blur" },
  988. ];
  989. }
  990. if (i.type == "textarea" && i.require) {
  991. rules1[i.label] = [
  992. { required: true, message: i.placeholder, trigger: "blur" },
  993. ];
  994. }
  995. if (i.type == "radio" && i.require) {
  996. rules1[i.label] = [
  997. { required: true, message: i.placeholder, trigger: "change" },
  998. ];
  999. }
  1000. if (i.type == "checkbox" && i.require) {
  1001. rules1[i.label] = [
  1002. { required: true, message: i.placeholder, trigger: "change" },
  1003. ];
  1004. }
  1005. if (i.type == "image" && i.require) {
  1006. rules1[i.label] = [
  1007. { required: true, message: i.placeholder, trigger: "change" },
  1008. ];
  1009. }
  1010. // 域组件rules
  1011. if (i.type == "group") {
  1012. i.children.forEach((item) => {
  1013. if (item.type == "input" && item.require) {
  1014. rules1[item.label + "(" + i.label + ")"] = [
  1015. {
  1016. required: true,
  1017. message: item.placeholder,
  1018. trigger: "blur",
  1019. },
  1020. ];
  1021. }
  1022. if (item.type == "textarea" && item.require) {
  1023. rules1[item.label + "(" + i.label + ")"] = [
  1024. {
  1025. required: true,
  1026. message: item.placeholder,
  1027. trigger: "blur",
  1028. },
  1029. ];
  1030. }
  1031. if (item.type == "radio" && item.require) {
  1032. rules1[item.label + "(" + i.label + ")"] = [
  1033. {
  1034. required: true,
  1035. message: item.placeholder,
  1036. trigger: "change",
  1037. },
  1038. ];
  1039. }
  1040. if (item.type == "checkbox" && item.require) {
  1041. _this.$set(_this.form2, item.label + "(" + i.label + ")", []);
  1042. rules1[item.label + "(" + i.label + ")"] = [
  1043. {
  1044. required: true,
  1045. message: item.placeholder,
  1046. trigger: "change",
  1047. },
  1048. ];
  1049. }
  1050. if (item.type == "image" && item.require) {
  1051. _this.$set(_this.form2, item.label+'('+i.label+')', []);
  1052. rules1[item.label + "(" + i.label + ")"] = [
  1053. {
  1054. required: true,
  1055. message: item.placeholder,
  1056. trigger: "change",
  1057. },
  1058. ];
  1059. }
  1060. });
  1061. }
  1062. console.log(rules1, 2222222222222);
  1063. });
  1064. this.$set(this.rules1, "rules", rules1);
  1065. // debugger
  1066. this.dialogVisible1 = true;
  1067. }
  1068. });
  1069. },
  1070. upload(type) {
  1071. var file = document.getElementById(type).files;
  1072. var data = new FormData();
  1073. data.append("file", file[0]);
  1074. this.$api.uploadFile(data).then((res) => {
  1075. if (res.data.code == 0) {
  1076. this.$set(this.form1, type, res.data.data.url);
  1077. this.$set(this.form1, "filename", res.data.data.name);
  1078. this.$message({ message: "上传成功!", type: "success" });
  1079. } else {
  1080. this.$message.error(res.data.message);
  1081. }
  1082. });
  1083. },
  1084. handleChange(value) {
  1085. console.log(value);
  1086. },
  1087. search() {
  1088. let parm = this.form;
  1089. this.getData();
  1090. },
  1091. search1() {
  1092. let parm = this.form1;
  1093. let type = this.cur_post_type;
  1094. let message_id = this.cur_message_id;
  1095. parm.type = type;
  1096. parm.message_id = message_id;
  1097. this.dialogTitle2 = "统计结果";
  1098. this.dialogVisible2 = true;
  1099. this.$api.getMessageSurveyAnalyse(parm).then((res) => {
  1100. this.analyseDataList = res.data.data.list;
  1101. this.cur_message_id = message_id;
  1102. this.cur_post_type = type;
  1103. });
  1104. },
  1105. openDiag() {
  1106. this.form1 = {};
  1107. this.dialogVisible = true;
  1108. this.dialogTitle = "新建内部问卷";
  1109. },
  1110. gopage(size) {
  1111. if (size) {
  1112. this.form.page_size = size;
  1113. }
  1114. this.form.page = this.$refs.pageButton.page;
  1115. this.getData();
  1116. },
  1117. getData() {
  1118. var parm = this.form;
  1119. parm.type = 0;
  1120. this.loading = true;
  1121. this.$api.getAllTemplateList().then((res) => {
  1122. this.templateList = res.data.data;
  1123. });
  1124. this.$api.getAllSysUserList().then((res) => {
  1125. this.userList = res.data.data;
  1126. });
  1127. this.$api.getMessageList(parm).then((res) => {
  1128. this.list = res.data.data.list;
  1129. this.total = res.data.data.total;
  1130. this.loading = false;
  1131. });
  1132. this.$api.getMessageReceiverList().then((res) => {
  1133. this.options = res.data.data;
  1134. });
  1135. },
  1136. del(id) {
  1137. this.$confirm("确定删除吗", "提示", {
  1138. type: "warning",
  1139. }).then(() => {
  1140. this.$api.delMessageInfo({ id: id }).then((res) => {
  1141. this.$message({
  1142. message: "删除成功",
  1143. type: "success",
  1144. });
  1145. this.getData();
  1146. });
  1147. });
  1148. },
  1149. edit(row) {
  1150. this.$api.getMessageInfo({ id: row.id }).then((res) => {
  1151. this.form1 = res.data.data;
  1152. let receiver_ids = this.form1.receiver_id;
  1153. if (typeof receiver_ids == "string") {
  1154. receiver_ids = JSON.parse(receiver_ids);
  1155. }
  1156. this.form1.receiver_id = receiver_ids;
  1157. this.dialogVisible = true;
  1158. });
  1159. },
  1160. saveResult() {
  1161. console.log(this.form2)
  1162. this.$refs["form2"].validate((valid) => {
  1163. if (valid) {
  1164. let result = JSON.stringify(this.form2);
  1165. this.$api
  1166. .saveSurveyResult({
  1167. message_id: this.message_id,
  1168. result: result,
  1169. })
  1170. .then((res) => {
  1171. if (res.data.code == 0) {
  1172. this.$message({
  1173. type: "success",
  1174. message: "保存成功!",
  1175. });
  1176. this.dialogVisible1 = false;
  1177. this.getData();
  1178. } else {
  1179. this.$message.error(res.data.message);
  1180. }
  1181. });
  1182. }
  1183. });
  1184. },
  1185. save() {
  1186. this.loading = true;
  1187. this.$refs["form1"].validate((valid) => {
  1188. if (valid) {
  1189. let parm = this.form1;
  1190. let id = this.form1.id;
  1191. parm.receiver_id = JSON.stringify(parm.receiver_id);
  1192. if (id) {
  1193. this.dialogVisible = false;
  1194. this.$api.editMessage(parm).then((res) => {
  1195. if (res.data.code == 0) {
  1196. this.$message({
  1197. type: "success",
  1198. message: "保存成功!",
  1199. });
  1200. } else {
  1201. this.$message.error("保存失败!");
  1202. }
  1203. this.getData();
  1204. this.loading = false;
  1205. });
  1206. } else {
  1207. this.dialogVisible = false;
  1208. this.$api.addMessage(parm).then((res) => {
  1209. if (res.data.code == 0) {
  1210. this.$message({
  1211. type: "success",
  1212. message: "保存成功!",
  1213. });
  1214. } else {
  1215. this.$message.error("保存失败!");
  1216. }
  1217. this.getData();
  1218. });
  1219. }
  1220. }
  1221. });
  1222. },
  1223. },
  1224. created() {
  1225. this.getData();
  1226. },
  1227. };
  1228. </script>