report.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. <template>
  2. <div class="page">
  3. <div class="top adfacjb">
  4. <div class="t_l">
  5. <p>报告管理</p>
  6. <p class="tip">访问和分析PERILL评估报告</p>
  7. </div>
  8. <div class="t_r">
  9. <!-- <el-button type="primary" icon="el-icon-upload2">导出报告</el-button> -->
  10. </div>
  11. </div>
  12. <div class="tabs adfac">
  13. <div class="t_pre" :class="{'active':tidx===1}" @click="handleChangeTab(1)">团队报告</div>
  14. <div class="t_pre" :class="{'active':tidx===2}" @click="handleChangeTab(2)">个人报告</div>
  15. </div>
  16. <div class="query adfacjb">
  17. <el-input placeholder="请输入内容" prefix-icon="el-icon-search" v-model="queryParams.name" style="width: calc(100% - 448px);"></el-input>
  18. <el-select v-model="queryParams.team" placeholder="所有团队" style="width: 200px;"></el-select>
  19. <el-select v-model="queryParams.sort" placeholder="排序方式" style="width: 200px;"></el-select>
  20. </div>
  21. <template v-if="tidx===1">
  22. <div class="list">
  23. <reportList :item="item" :reportList="item.reportList" :showMore="item.showMore"
  24. v-for="(item, index) in teamList" :key="index"
  25. @toggleReport="e=>toggleReportTeam(e,index)"
  26. @deleteReport="e=>deleteTeamReport(e,index,item)"
  27. @sendReport="e=>sendReportTeam(e,index,item)"
  28. @reCreateReport="e=>reCreateReportTeam(e,index,item)"
  29. @refreshReportList="e=>refreshReportTeamList(e,index)">
  30. </reportList>
  31. </div>
  32. </template>
  33. <template v-else-if="tidx===2">
  34. <div class="list">
  35. <reportList :item="item" :reportList="item.reportList" :showMore="item.showMore" :isTeam="false"
  36. v-for="(item, index) in personList" :key="index"
  37. @toggleReport="e=>toggleReportPerson(e,index)"
  38. @deleteReport="e=>deletePersonReport(e,index,item)"
  39. @sendReport="e=>sendReportPerson(e,index,item)"
  40. @reCreateReport="e=>reCreateReportPerson(e,index,item)"
  41. @refreshReportList="e=>refreshReportPersonList(e,index)">
  42. </reportList>
  43. </div>
  44. </template>
  45. </div>
  46. </template>
  47. <script setup name="">
  48. import reportList from '@/components/reportList/index.vue'
  49. import { ref, getCurrentInstance, onMounted } from 'vue'
  50. const { proxy } = getCurrentInstance();
  51. import {
  52. getTeamQuestionnaireList,
  53. getTeamReportWjList,
  54. getPersonReportWjList,
  55. deleteTeamReportWj,
  56. sendReportById,
  57. reCreateReport,
  58. getPersonQueList
  59. } from "@/api/agent/index.js";
  60. const tidx = ref(1)
  61. const queryParams = ref({
  62. name: '',
  63. team: '',
  64. sort: ''
  65. })
  66. const teamList = ref([])
  67. const personList = ref([])
  68. const handleChangeTab = (idx) => {
  69. tidx.value = idx;
  70. if(idx===1) getTeamList()
  71. else if(idx===2) getPersonList()
  72. }
  73. const toggleReportTeam = (e,idx) => {
  74. teamList.value[idx].showMore = !teamList.value[idx].showMore;
  75. if(teamList.value[idx].showMore){
  76. getTeamReportWjList(e.id).then(res=>{
  77. if(res.code!==0) return proxy.$message.error(res.msg)
  78. teamList.value[idx].reportList = res.data;
  79. })
  80. }else teamList.value[idx].reportList = [];
  81. }
  82. const toggleReportPerson = (e,idx) => {
  83. personList.value[idx].showMore = !personList.value[idx].showMore;
  84. if(personList.value[idx].showMore){
  85. getPersonReportWjList(e.id).then(res=>{
  86. if(res.code!==0) return proxy.$message.error(res.msg)
  87. personList.value[idx].reportList = res.data;
  88. })
  89. }else personList.value[idx].reportList = [];
  90. }
  91. const getTeamList = (callback) => {
  92. getTeamQuestionnaireList(queryParams.value).then(res=>{
  93. if(res.code!==0) return proxy.$message.error(res.msg)
  94. teamList.value = res.data.list;
  95. teamList.value = teamList.value.map(item=>{
  96. return {
  97. ...item,
  98. showMore:false,
  99. reportList:[]
  100. };
  101. })
  102. callback && callback()
  103. })
  104. }
  105. const getPersonList = (callback) => {
  106. getPersonQueList({teamId:''}).then(res=>{
  107. if(res.code!==0) return proxy.$message.error(res.msg)
  108. personList.value = res.data;
  109. personList.value = personList.value.map(item=>{
  110. return {
  111. ...item,
  112. showMore:false,
  113. reportList:[]
  114. };
  115. })
  116. callback && callback()
  117. })
  118. }
  119. const deleteTeamReport = (e,idx,item) => {
  120. proxy.$modal.confirm('确认删除该报告吗?如确认会立即执行!').then(async function () {
  121. let res = await deleteTeamReportWj([e]);
  122. if(res.code===0){
  123. proxy.$message.success('删除成功!');
  124. getTeamReportWjData(item.id,idx)
  125. } else proxy.$message.error(res.msg)
  126. }).then(() => {}).finally(() => {});
  127. }
  128. const deletePersonReport = (e,idx,item) => {
  129. proxy.$modal.confirm('确认删除该报告吗?如确认会立即执行!').then(async function () {
  130. let res = await deleteTeamReportWj([e]);
  131. if(res.code===0){
  132. proxy.$message.success('删除成功!');
  133. getPersonReportWjData(item.id,idx)
  134. } else proxy.$message.error(res.msg)
  135. }).then(() => {}).finally(() => {});
  136. }
  137. const sendReportTeam = (e,idx,item) => {
  138. sendReportById(e).then(res=>{
  139. if(res.code!==0) return proxy.$message.error(res.msg)
  140. proxy.$message.success('发送成功!')
  141. getTeamReportWjData(item.id,idx)
  142. })
  143. }
  144. const sendReportPerson = (e,idx,item) => {
  145. sendReportById(e).then(res=>{
  146. if(res.code!==0) return proxy.$message.error(res.msg)
  147. proxy.$message.success('发送成功!')
  148. getPersonReportWjData(item.id,idx)
  149. })
  150. }
  151. const reCreateReportTeam = (e,idx,item) => {
  152. reCreateReport(e).then(res=>{
  153. if(res.code!==0) return proxy.$message.error(res.msg)
  154. proxy.$message.success('重新生成成功!')
  155. getTeamReportWjData(item.id,idx)
  156. })
  157. }
  158. const reCreateReportPerson = (e,idx,item) => {
  159. reCreateReport(e).then(res=>{
  160. if(res.code!==0) return proxy.$message.error(res.msg)
  161. proxy.$message.success('重新生成成功!')
  162. getPersonReportWjData(item.id,idx)
  163. })
  164. }
  165. const refreshReportTeamList = (e,idx) => {
  166. getTeamReportWjData(e,idx)
  167. }
  168. const refreshReportPersonList = (e,idx) => {
  169. getPersonReportWjData(e,idx)
  170. }
  171. const getTeamReportWjData = (id,idx) => {
  172. getTeamReportWjList(id).then(res=>{
  173. if(res.code!==0) return proxy.$message.error(res.msg)
  174. teamList.value[idx].reportList = res.data;
  175. })
  176. }
  177. const getPersonReportWjData = (id,idx) => {
  178. getPersonReportWjList(id).then(res=>{
  179. if(res.code!==0) return proxy.$message.error(res.msg)
  180. personList.value[idx].reportList = res.data;
  181. })
  182. }
  183. onMounted(async ()=>{
  184. let type = proxy.$route.query?.type;
  185. let relationId = proxy.$route.query?.relationId;
  186. if(!type) return getTeamList()
  187. if(type==1){
  188. getTeamList(()=>{
  189. let idx = teamList.value.findIndex(item=>item.id==relationId)
  190. if(idx>-1) toggleReportTeam(teamList.value[idx],idx)
  191. })
  192. }else if(type==2){
  193. tidx.value = 2;
  194. getPersonList(()=>{
  195. let idx = personList.value.findIndex(item=>item.id==relationId)
  196. if(idx>-1) toggleReportPerson(personList.value[idx],idx)
  197. })
  198. }
  199. })
  200. </script>
  201. <style scoped lang="scss">
  202. .page{
  203. padding: 28px 20px;
  204. background: #FAFAFA;
  205. .top{
  206. .t_l{
  207. p{
  208. font-family: PingFang-SC, PingFang-SC;
  209. font-weight: bold;
  210. font-size: 16px;
  211. color: #252525;
  212. line-height: 16px;
  213. &.tip{
  214. font-family: PingFangSC, PingFang SC;
  215. font-weight: 400;
  216. font-size: 14px;
  217. color: #6B7280;
  218. line-height: 14px;
  219. margin-top: 16px;
  220. }
  221. }
  222. }
  223. }
  224. .tabs{
  225. width: 100%;
  226. margin-top: 28px;
  227. border-bottom: 1px solid #E5E7EB;
  228. .t_pre{
  229. width: 116px;
  230. padding-bottom: 18px;
  231. position: relative;
  232. font-family: PingFangSC, PingFang SC;
  233. font-weight: 400;
  234. font-size: 14px;
  235. color: #252525;
  236. line-height: 16px;
  237. text-align: center;
  238. cursor: pointer;
  239. &.active{
  240. font-weight: bold;
  241. color: #761E6A;
  242. &::after{
  243. content: '';
  244. width: 116px;
  245. height: 2px;
  246. background: #761E6A;
  247. position: absolute;
  248. left: 0;
  249. bottom: 0;
  250. }
  251. }
  252. }
  253. }
  254. .query{
  255. width: 100%;
  256. padding: 16px 20px;
  257. box-sizing: border-box;
  258. background: #FFFFFF;
  259. border-radius: 6px;
  260. border: 1px solid #F3F4F6;
  261. margin-top: 31px;
  262. }
  263. .list{
  264. .l_item{
  265. margin-top: 10px;
  266. width: 100%;
  267. padding: 24px;
  268. box-sizing: border-box;
  269. background: #FFFFFF;
  270. border-radius: 6px;
  271. border: 1px solid #F3F4F6;
  272. .li_l{
  273. .li_pre{
  274. width: 335px;
  275. .lit_text{
  276. font-family: PingFang-SC, PingFang-SC;
  277. font-weight: bold;
  278. font-size: 14px;
  279. color: #252525;
  280. line-height: 14px;
  281. text-align: left;
  282. overflow: hidden;
  283. text-overflow: ellipsis;
  284. white-space: nowrap;
  285. }
  286. .lit_tip{
  287. font-family: PingFangSC, PingFang SC;
  288. font-weight: 400;
  289. font-size: 14px;
  290. color: #6B7280;
  291. line-height: 14px;
  292. text-align: left;
  293. margin-top: 16px;
  294. }
  295. }
  296. }
  297. }
  298. }
  299. }
  300. </style>