customerGroupDetails.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. <template>
  2. <div style="background-color: #fff;margin: 15px">
  3. <el-card class="box-card">
  4. <div class="desct">
  5. 数据统计
  6. </div>
  7. <div class="statistics-container">
  8. <el-row :gutter="20" type="flex" justify="space-between">
  9. <el-col :span="6" v-for="(item, index) in CountGroupMsgUserList" :key="index">
  10. <el-card style="height: 100px">
  11. <div class="statistic-item">
  12. <h2>{{ item.count }} </h2>
  13. <p>{{ item.label }}</p>
  14. </div>
  15. </el-card>
  16. </el-col>
  17. </el-row>
  18. </div>
  19. </el-card>
  20. <el-card class="box-card" style="margin-top: 10px">
  21. <div style="margin-bottom: 2%">
  22. <div class="desct">
  23. 发送接收详情
  24. </div>
  25. <el-alert
  26. title="注意事项"
  27. type="warning"
  28. description="1、因企业微信接口限制,提醒成员完成群发任务,24小时内每个群发最多触发三次提醒,多点无效噢。2、成员选择客户发送之后,未选择的客户不能再次选择发送了"
  29. :closable="false"
  30. show-icon>
  31. </el-alert>
  32. </div>
  33. <div>
  34. <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="120px">
  35. <el-form-item label="成员姓名" prop="nickName">
  36. <el-input
  37. v-model="queryParams.nickName"
  38. placeholder="请输入想查询的成员姓名"
  39. clearable
  40. size="small"
  41. @keyup.enter.native="handleQuery"
  42. />
  43. </el-form-item>
  44. <el-form-item label="客户名称" prop="name">
  45. <el-input
  46. v-model="queryParams.name"
  47. placeholder="请输入想查询的客户姓名"
  48. clearable
  49. size="small"
  50. @keyup.enter.native="handleQuery"
  51. />
  52. </el-form-item>
  53. <el-form-item label="成员发送状态" prop="status">
  54. <el-select v-model="queryParams.status" placeholder="请选择员工发送状态" >
  55. <el-option v-for="item in groupMsgStatusOptions"
  56. :key="item.dictValue"
  57. :label="item.dictLabel"
  58. :value="item.dictValue">
  59. </el-option>
  60. </el-select>
  61. </el-form-item>
  62. <el-form-item label="客户接收状态" prop="sendStatus">
  63. <el-select v-model="queryParams.sendStatus" placeholder="请选择客户接收状态">
  64. <el-option v-for="item in groupMsgSendStatusOptions"
  65. :key="item.dictValue"
  66. :label="item.dictLabel"
  67. :value="item.dictValue">
  68. </el-option>
  69. </el-select>
  70. </el-form-item>
  71. <el-form-item>
  72. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  73. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置/刷新页面</el-button>
  74. <el-button type="warning" icon="el-icon-message-solid" size="mini" @click="triggerRemindGroupMsg">提醒成员发送</el-button>
  75. <el-button type="primary" icon="el-icon-refresh" size="mini" plain @click="refreshResults">刷新/获取企微结果</el-button>
  76. </el-form-item>
  77. </el-form>
  78. <el-table v-loading="loading" :data="groupMsgUserDetailsList">
  79. <el-table-column label="销售" align="center" prop="nickName" />
  80. <el-table-column label="成员企微昵称" align="center" prop="qwUserName" />
  81. <el-table-column label="成员发送状态" align="center" prop="status">
  82. <template slot-scope="scope">
  83. <dict-tag :options="groupMsgStatusOptions" :value="scope.row.status"/>
  84. </template>
  85. </el-table-column>
  86. <el-table-column label="客户" align="center" prop="name" >
  87. <template slot-scope="scope">
  88. <el-image
  89. v-if="scope.row.avatar"
  90. style="width: 20px; height: 20px"
  91. :src="scope.row.avatar"
  92. fit="contain"
  93. @click="openImageViewer(scope.row.avatar)"
  94. />
  95. <span>{{scope.row.name}}</span>
  96. </template>
  97. </el-table-column>
  98. <el-table-column label="客户接收状态" align="center" prop="sendStatus" >
  99. <template slot-scope="scope">
  100. <dict-tag :options="groupMsgSendStatusOptions" :value="scope.row.sendStatus"/>
  101. </template>
  102. </el-table-column>
  103. </el-table>
  104. </div>
  105. <pagination
  106. v-show="total>0"
  107. :total="total"
  108. :page.sync="queryParams.pageNum"
  109. :limit.sync="queryParams.pageSize"
  110. @pagination="getUserList"
  111. />
  112. </el-card>
  113. <!-- 大图预览对话框 -->
  114. <el-dialog
  115. :visible.sync="dialogVisible"
  116. :modal="false"
  117. width="1200px"
  118. append-to-body>
  119. <img
  120. :src="this.dialogImageUrl"
  121. style="display: block; max-width: 100%; margin: 0 auto"
  122. />
  123. </el-dialog>
  124. </div>
  125. </template>
  126. <script>
  127. import { countGroupMsgUser, CountGroupMsgUserDetails, remindGroupMsg } from '@/api/qw/groupMsg'
  128. import { refreshResultsMsgUser } from '@/api/qw/groupMsgUser'
  129. export default {
  130. name: "Customer-group-details",
  131. components:{},
  132. props:{
  133. rowDetailFrom:{},
  134. },
  135. watch:{
  136. rowDetailFrom:{
  137. handler(newVal){
  138. // 当formData变化时重新查询
  139. this.getUserList(newVal);
  140. this.getCountGroupMsgUser(newVal.groupMsgId)
  141. },
  142. deep: true
  143. }
  144. },
  145. data() {
  146. return {
  147. //数据统计
  148. CountGroupMsgUserList: [],
  149. //成员详情
  150. groupMsgUserDetailsList:[],
  151. //成员发送状态
  152. groupMsgStatusOptions:[],
  153. //客户接收状态
  154. groupMsgSendStatusOptions:[],
  155. //放大图片
  156. dialogImageUrl:null,
  157. dialogVisible:false,
  158. // 遮罩层
  159. loading: true,
  160. // 导出遮罩层
  161. exportLoading: false,
  162. // 选中数组
  163. ids: [],
  164. // 非单个禁用
  165. single: true,
  166. // 非多个禁用
  167. multiple: true,
  168. // 显示搜索条件
  169. showSearch: true,
  170. // 总条数
  171. total: 0,
  172. // 弹出层标题
  173. title: "",
  174. // 是否显示弹出层
  175. open: false,
  176. // 查询参数
  177. queryParams: {
  178. pageNum: 1,
  179. pageSize: 10,
  180. qwMsgId:null,
  181. msgId:null,
  182. nickName:null,
  183. name:null,
  184. status:null,
  185. sendStatus:null,
  186. chatType:"single",
  187. },
  188. // 表单参数
  189. form: {},
  190. // 表单校验
  191. rules: {
  192. },
  193. };
  194. },
  195. created() {
  196. this.getUserList(this.rowDetailFrom)
  197. this.getCountGroupMsgUser(this.rowDetailFrom.id)
  198. //成员发送状态
  199. this.getDicts("sys_qw_groupMsg_status").then(response => {
  200. this.groupMsgStatusOptions = response.data;
  201. });
  202. //客户接收状态
  203. this.getDicts("sys_qw_groupMsg_SendStatus").then(response => {
  204. this.groupMsgSendStatusOptions = response.data;
  205. });
  206. },
  207. methods: {
  208. //获取成员详细
  209. getUserList(val){
  210. this.queryParams.msgId = val.id || this.rowDetailFrom.id;
  211. this.loading=false;
  212. CountGroupMsgUserDetails(this.queryParams).then(res=>{
  213. this.groupMsgUserDetailsList=res.rows
  214. this.total = res.total;
  215. this.loading = false;
  216. })
  217. },
  218. /** 提醒成员群发 */
  219. triggerRemindGroupMsg(){
  220. this.queryParams.qwMsgId=this.rowDetailFrom.msgId
  221. remindGroupMsg(this.queryParams).then(res=>{
  222. if (res.code==200){
  223. if (res.data.errcode==0){
  224. return this.msgSuccess("提醒成员群发成功")
  225. }else if (res.data.errcode==41094){
  226. return this.msgWarning("此条记录的每日提醒次数超过限制了噢")
  227. }else {
  228. return this.msgError(res.data.errmsg)
  229. }
  230. }else {
  231. return this.msgError(res.msg)
  232. }
  233. })
  234. },
  235. /** 刷新获取结果 */
  236. refreshResults(){
  237. let params = [];
  238. this.loading = true;
  239. //搞定定时任务导致的问题
  240. let ResultsMsgUser={
  241. id:this.rowDetailFrom.id,
  242. msgId:this.rowDetailFrom.msgId,
  243. chatType:this.rowDetailFrom.chatType,
  244. timerResultType:1,
  245. companyId:this.rowDetailFrom.companyId,
  246. corpId:this.rowDetailFrom.corpId,
  247. }
  248. // 根据不同条件选择参数
  249. if (this.groupMsgUserDetailsList == 0) {
  250. params.push(ResultsMsgUser)
  251. } else {
  252. params = this.groupMsgUserDetailsList// 如果 `groupMsgUserDetailsList` 是一个对象
  253. }
  254. refreshResultsMsgUser(params).then(res=>{
  255. this.loading=false;
  256. if (res.code==200){
  257. this.handleQuery();
  258. return this.msgSuccess(res.msg)
  259. }else {
  260. this.handleQuery();
  261. return this.msgError(res.msg)
  262. }
  263. })
  264. },
  265. /** 搜索按钮操作 */
  266. handleQuery() {
  267. this.queryParams.pageNum = 1;
  268. this.getUserList(this.rowDetailFrom);
  269. },
  270. /** 重置按钮操作 */
  271. resetQuery() {
  272. this.resetForm("queryForm");
  273. this.handleQuery();
  274. },
  275. openImageViewer(url) {
  276. // 打开大图预览对话框
  277. this.dialogImageUrl=url
  278. this.dialogVisible = true;
  279. },
  280. //数据详情
  281. getCountGroupMsgUser(val){
  282. countGroupMsgUser(val).then(res=>{
  283. this.CountGroupMsgUserList=Object.keys(res.data).map(key=>{
  284. return {label: key,count:res.data[key]}
  285. })
  286. })
  287. },
  288. }
  289. };
  290. </script>
  291. <style scoped>
  292. .desct{
  293. padding-bottom: 20px;
  294. color: #524b4a;
  295. font-weight: bold;
  296. }
  297. .statistics-container {
  298. padding: 20px;
  299. }
  300. .statistic-item {
  301. text-align: center;
  302. }
  303. .statistic-item h2 {
  304. font-size: 24px;
  305. margin: 0;
  306. font-weight: normal;
  307. }
  308. .statistic-item p {
  309. margin: 5px 0 0;
  310. color: #666;
  311. font-weight: normal;
  312. }
  313. </style>