diff --git a/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java b/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java index 3582444176..249b06dc4b 100644 --- a/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java +++ b/backend/src/main/java/io/dataease/controller/chart/ChartViewController.java @@ -166,17 +166,17 @@ public class ChartViewController { @ApiIgnore @ApiOperation("获取字段值") - @PostMapping("/getFieldData/{id}/{panelId}/{fieldId}") - public List getFieldData(@PathVariable String id, @PathVariable String panelId, @PathVariable String fieldId, + @PostMapping("/getFieldData/{id}/{panelId}/{fieldId}/{fieldType}") + public List getFieldData(@PathVariable String id, @PathVariable String panelId, @PathVariable String fieldId, @PathVariable String fieldType, @RequestBody ChartExtRequest requestList) throws Exception { - return chartViewService.getFieldData(id, requestList, false, fieldId); + return chartViewService.getFieldData(id, requestList, false, fieldId, fieldType); } @ApiIgnore @ApiOperation("更新视图属性") @PostMapping("/viewPropsSave/{panelId}") - public void viewPropsSave(@PathVariable String panelId, @RequestBody ChartViewWithBLOBs chartViewWithBLOBs) { - chartViewService.viewPropsSave(chartViewWithBLOBs); + public void viewPropsSave(@PathVariable String panelId, @RequestBody ChartViewWithBLOBs chartViewWithBLOBs) { + chartViewService.viewPropsSave(chartViewWithBLOBs); } @ApiOperation("查询仪表板下视图选项") diff --git a/backend/src/main/java/io/dataease/controller/sys/MsgController.java b/backend/src/main/java/io/dataease/controller/sys/MsgController.java index 5cadd80227..e7f8cc5cf9 100644 --- a/backend/src/main/java/io/dataease/controller/sys/MsgController.java +++ b/backend/src/main/java/io/dataease/controller/sys/MsgController.java @@ -3,6 +3,7 @@ package io.dataease.controller.sys; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import com.github.xiaoymin.knife4j.annotations.ApiSupport; +import io.dataease.auth.service.AuthUserService; import io.dataease.plugins.common.base.domain.SysMsgChannel; import io.dataease.plugins.common.base.domain.SysMsgSetting; import io.dataease.plugins.common.base.domain.SysMsgType; @@ -19,9 +20,11 @@ import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.ObjectUtils; import org.springframework.web.bind.annotation.*; + import javax.annotation.Resource; import java.util.List; import java.util.stream.Collectors; + import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -34,17 +37,20 @@ public class MsgController { @Resource private SysMsgService sysMsgService; + @Resource + private AuthUserService authUserService; + @ApiOperation("分页查询") @PostMapping("/list/{goPage}/{pageSize}") @ApiImplicitParams({ - @ApiImplicitParam(paramType="path", name = "goPage", value = "页码", required = true, dataType = "Integer"), - @ApiImplicitParam(paramType="path", name = "pageSize", value = "页容量", required = true, dataType = "Integer"), - @ApiImplicitParam(name = "msgRequest", value = "查询条件", required = true) + @ApiImplicitParam(paramType = "path", name = "goPage", value = "页码", required = true, dataType = "Integer"), + @ApiImplicitParam(paramType = "path", name = "pageSize", value = "页容量", required = true, dataType = "Integer"), + @ApiImplicitParam(name = "msgRequest", value = "查询条件", required = true) }) public Pager> messages(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody MsgRequest msgRequest) { Long userId = AuthUtils.getUser().getUserId(); List typeIds = null; - if (ObjectUtils.isNotEmpty(msgRequest.getType())){ + if (ObjectUtils.isNotEmpty(msgRequest.getType())) { List sysMsgTypes = sysMsgService.queryMsgTypes(); typeIds = sysMsgTypes.stream().filter(sysMsgType -> msgRequest.getType() == sysMsgType.getPid()).map(SysMsgType::getMsgTypeId).collect(Collectors.toList()); } @@ -56,9 +62,10 @@ public class MsgController { @ApiOperation("查询未读数量") @PostMapping("/unReadCount") - public Long unReadCount() {; + public Long unReadCount() { + ; Long userId = null; - if(null == AuthUtils.getUser() || (userId = AuthUtils.getUser().getUserId()) == null) { + if (null == AuthUtils.getUser() || (userId = AuthUtils.getUser().getUserId()) == null) { throw new RuntimeException("缺少用户ID"); } return sysMsgService.queryCount(userId); @@ -66,7 +73,7 @@ public class MsgController { @ApiOperation("设置已读") @PostMapping("/setReaded/{msgId}") - @ApiImplicitParam(paramType="path", name = "msgId", value = "消息ID", required = true, dataType = "Long") + @ApiImplicitParam(paramType = "path", name = "msgId", value = "消息ID", required = true, dataType = "Long") public void setReaded(@PathVariable Long msgId) { sysMsgService.setReaded(msgId); } @@ -109,7 +116,21 @@ public class MsgController { @ApiOperation("查询渠道") @PostMapping("/channelList") public List channelList() { - return sysMsgService.channelList(); + List sysMsgChannels = sysMsgService.channelList(); + if (ObjectUtils.isEmpty(sysMsgChannels)) return sysMsgChannels; + return sysMsgChannels.stream().filter(channel -> { + Long msgChannelId = channel.getMsgChannelId(); + if (msgChannelId == 3L) { + return authUserService.supportWecom(); + } + if (msgChannelId == 4L) { + return authUserService.supportDingtalk(); + } + if (msgChannelId == 5L) { + return authUserService.supportLark(); + } + return true; + }).collect(Collectors.toList()); } @ApiOperation("查询订阅") diff --git a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java index 6b7becc484..2833af3d71 100644 --- a/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java +++ b/backend/src/main/java/io/dataease/job/sechedule/strategy/impl/EmailTaskHandler.java @@ -29,6 +29,7 @@ import io.dataease.plugins.xpack.wecom.dto.entity.WecomMsgResult; import io.dataease.plugins.xpack.wecom.service.WecomXpackService; import io.dataease.service.chart.ViewExportExcel; import io.dataease.service.system.EmailService; +import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.quartz.*; @@ -152,6 +153,7 @@ public class EmailTaskHandler extends TaskHandler implements Job { public void sendReport(GlobalTaskInstance taskInstance, XpackEmailTemplateDTO emailTemplateDTO, SysUserEntity user) { EmailXpackService emailXpackService = SpringContextUtil.getBean(EmailXpackService.class); + AuthUserServiceImpl userService = SpringContextUtil.getBean(AuthUserServiceImpl.class); try { XpackEmailTaskRequest taskForm = emailXpackService.taskForm(taskInstance.getTaskId()); if (ObjectUtils.isEmpty(taskForm) || CronUtils.taskExpire(taskForm.getEndTime())) { @@ -168,6 +170,21 @@ public class EmailTaskHandler extends TaskHandler implements Job { LogUtil.info("picture of " + url + " is finished"); // 下面继续执行发送邮件的 String recipients = emailTemplateDTO.getRecipients(); + String reciUsers = emailTemplateDTO.getReciUsers(); + List reciLists = null; + if (StringUtils.isNotBlank(reciUsers)) { + String emailUsers = Arrays.stream(reciUsers.split(",")).map(userService::getUserByName).filter(tempUser -> StringUtils.isNotBlank(tempUser.getEmail())).map(SysUserEntity::getEmail).collect(Collectors.joining(",")); + if (StringUtils.isNotBlank(emailUsers)) { + if (StringUtils.isNotBlank(recipients)) { + recipients += "," + emailUsers; + } else { + recipients = emailUsers; + } + } + reciLists = Arrays.stream(reciUsers.split(",")).collect(Collectors.toList()); + } + + byte[] content = emailTemplateDTO.getContent(); EmailService emailService = SpringContextUtil.getBean(EmailService.class); @@ -194,38 +211,61 @@ public class EmailTaskHandler extends TaskHandler implements Job { channels = Arrays.stream(recisetting.split(",")).collect(Collectors.toList()); } - List reciLists = Arrays.stream(recipients.split(",")).collect(Collectors.toList()); + for (int i = 0; i < channels.size(); i++) { String channel = channels.get(i); switch (channel) { case "email" : + if (StringUtils.isNotBlank(recipients)) emailService.sendWithImageAndFiles(recipients, emailTemplateDTO.getTitle(), contentStr, bytes, files); break; case "wecom" : if (SpringContextUtil.getBean(AuthUserService.class).supportWecom()) { - WecomXpackService wecomXpackService = SpringContextUtil.getBean(WecomXpackService.class); - WecomMsgResult wecomMsgResult = wecomXpackService.pushOaMsg(reciLists, emailTemplateDTO.getTitle(), contentStr, bytes, files); - if (wecomMsgResult.getErrcode() != 0) { - DEException.throwException(wecomMsgResult.getErrmsg()); + + List wecomUsers = reciLists.stream().filter(reci -> { + SysUserEntity userBySub = userService.getUserBySub(reci, 4); + return ObjectUtils.isNotEmpty(userBySub); + }).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(wecomUsers)) { + WecomXpackService wecomXpackService = SpringContextUtil.getBean(WecomXpackService.class); + WecomMsgResult wecomMsgResult = wecomXpackService.pushOaMsg(wecomUsers, emailTemplateDTO.getTitle(), contentStr, bytes, files); + if (wecomMsgResult.getErrcode() != 0) { + DEException.throwException(wecomMsgResult.getErrmsg()); + } } + } break; case "dingtalk" : if (SpringContextUtil.getBean(AuthUserService.class).supportDingtalk()) { - DingtalkXpackService dingtalkXpackService = SpringContextUtil.getBean(DingtalkXpackService.class); - DingtalkMsgResult dingtalkMsgResult = dingtalkXpackService.pushOaMsg(reciLists, emailTemplateDTO.getTitle(), contentStr, bytes, files); - if (dingtalkMsgResult.getErrcode() != 0) { - DEException.throwException(dingtalkMsgResult.getErrmsg()); + List dingTalkUsers = reciLists.stream().filter(reci -> { + SysUserEntity userBySub = userService.getUserBySub(reci, 5); + return ObjectUtils.isNotEmpty(userBySub); + }).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(dingTalkUsers)) { + DingtalkXpackService dingtalkXpackService = SpringContextUtil.getBean(DingtalkXpackService.class); + DingtalkMsgResult dingtalkMsgResult = dingtalkXpackService.pushOaMsg(dingTalkUsers, emailTemplateDTO.getTitle(), contentStr, bytes, files); + if (dingtalkMsgResult.getErrcode() != 0) { + DEException.throwException(dingtalkMsgResult.getErrmsg()); + } } + } break; case "lark" : if (SpringContextUtil.getBean(AuthUserService.class).supportLark()) { - LarkXpackService larkXpackService = SpringContextUtil.getBean(LarkXpackService.class); - LarkMsgResult larkMsgResult = larkXpackService.pushOaMsg(reciLists, emailTemplateDTO.getTitle(), contentStr, bytes, files); - if (larkMsgResult.getCode() != 0) { - DEException.throwException(larkMsgResult.getMsg()); + List larkUsers = reciLists.stream().filter(reci -> { + SysUserEntity userBySub = userService.getUserBySub(reci, 6); + return ObjectUtils.isNotEmpty(userBySub); + }).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(larkUsers)) { + LarkXpackService larkXpackService = SpringContextUtil.getBean(LarkXpackService.class); + LarkMsgResult larkMsgResult = larkXpackService.pushOaMsg(larkUsers, emailTemplateDTO.getTitle(), contentStr, bytes, files); + if (larkMsgResult.getCode() != 0) { + DEException.throwException(larkMsgResult.getMsg()); + } } + } break; default: diff --git a/backend/src/main/java/io/dataease/plugins/server/XDingtalkServer.java b/backend/src/main/java/io/dataease/plugins/server/XDingtalkServer.java index d6ed61d1f0..fa187f5ed2 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XDingtalkServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XDingtalkServer.java @@ -48,6 +48,7 @@ public class XDingtalkServer { DingtalkXpackService dingtalkXpackService = SpringContextUtil.getBean(DingtalkXpackService.class); return dingtalkXpackService.info(); } + @ResponseBody @RequiresPermissions("sysparam:read") @PostMapping("/save") @@ -55,16 +56,18 @@ public class XDingtalkServer { DingtalkXpackService dingtalkXpackService = SpringContextUtil.getBean(DingtalkXpackService.class); dingtalkXpackService.save(settings); } + @ResponseBody @PostMapping("/testConn") public void testConn(@RequestBody DingtalkInfo dingtalkInfo) { DingtalkXpackService dingtalkXpackService = SpringContextUtil.getBean(DingtalkXpackService.class); try { dingtalkXpackService.testConn(dingtalkInfo); - }catch(Exception e) { + } catch (Exception e) { throw new RuntimeException(e); } } + @ResponseBody @PostMapping("/getQrParam") public DingQrResult getQrParam() { @@ -92,7 +95,7 @@ public class XDingtalkServer { String unionid = dingUserEntity.getUnionid(); SysUserEntity sysUserEntity = authUserService.getUserBySub(unionid, 5); if (null == sysUserEntity) { - String email = StringUtils.isNotBlank(dingUserEntity.getOrg_email()) ? dingUserEntity.getOrg_email() : StringUtils.isNotBlank(dingUserEntity.getEmail()) ? dingUserEntity.getEmail() : "demo@dingtalk.work"; + String email = StringUtils.isNotBlank(dingUserEntity.getOrg_email()) ? dingUserEntity.getOrg_email() : StringUtils.isNotBlank(dingUserEntity.getEmail()) ? dingUserEntity.getEmail() : (username + "@dingtalk.work"); sysUserService.validateExistUser(username, dingUserEntity.getName(), email); sysUserService.saveDingtalkCUser(dingUserEntity, email); sysUserEntity = authUserService.getUserBySub(unionid, 5); diff --git a/backend/src/main/java/io/dataease/plugins/server/XLarkServer.java b/backend/src/main/java/io/dataease/plugins/server/XLarkServer.java index 16c3d6a687..5021f746c4 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XLarkServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XLarkServer.java @@ -96,7 +96,7 @@ public class XLarkServer { String sub = larkUserInfo.getSub(); SysUserEntity sysUserEntity = authUserService.getUserBySub(sub, 6); if (null == sysUserEntity) { - String email = StringUtils.isNotBlank(larkUserInfo.getEmail()) ? larkUserInfo.getEmail() : "demo@lark.work"; + String email = StringUtils.isNotBlank(larkUserInfo.getEmail()) ? larkUserInfo.getEmail() : (username + "@lark.work"); sysUserService.validateExistUser(username, larkUserInfo.getName(), email); sysUserService.saveLarkCUser(larkUserInfo, email); sysUserEntity = authUserService.getUserBySub(sub, 6); diff --git a/backend/src/main/java/io/dataease/plugins/server/XWecomServer.java b/backend/src/main/java/io/dataease/plugins/server/XWecomServer.java index b50ee487e8..98e6ad8ce2 100644 --- a/backend/src/main/java/io/dataease/plugins/server/XWecomServer.java +++ b/backend/src/main/java/io/dataease/plugins/server/XWecomServer.java @@ -49,6 +49,7 @@ public class XWecomServer { WecomXpackService wecomXpackService = SpringContextUtil.getBean(WecomXpackService.class); return wecomXpackService.info(); } + @ResponseBody @RequiresPermissions("sysparam:read") @PostMapping("/save") @@ -56,16 +57,18 @@ public class XWecomServer { WecomXpackService wecomXpackService = SpringContextUtil.getBean(WecomXpackService.class); wecomXpackService.save(settings); } + @ResponseBody @PostMapping("/testConn") public void testConn(@RequestBody WecomInfo wecomInfo) { WecomXpackService wecomXpackService = SpringContextUtil.getBean(WecomXpackService.class); try { wecomXpackService.testConn(wecomInfo); - }catch(Exception e) { + } catch (Exception e) { throw new RuntimeException(e); } } + @ResponseBody @PostMapping("/getQrParam") public BaseQrResult getQrParam() { @@ -96,7 +99,7 @@ public class XWecomServer { SysUserEntity sysUserEntity = authUserService.getUserBySub(userId, 4); if (null == sysUserEntity) { Object emailObj = ObjectUtils.isEmpty(userMap.get("biz_mail")) ? userMap.get("email") : userMap.get("biz_mail"); - String email = ObjectUtils.isEmpty(emailObj) ? "demo@wecom.work" : emailObj.toString(); + String email = ObjectUtils.isEmpty(emailObj) ? (userId + "@wecom.work") : emailObj.toString(); sysUserService.validateExistUser(userId, userMap.get("name").toString(), email); sysUserService.saveWecomCUser(userMap, userId, email); sysUserEntity = authUserService.getUserBySub(userId, 4); diff --git a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java index 808787a8ac..ac1d72f929 100644 --- a/backend/src/main/java/io/dataease/service/chart/ChartViewService.java +++ b/backend/src/main/java/io/dataease/service/chart/ChartViewService.java @@ -966,7 +966,14 @@ public class ChartViewService { } } // 自定义排序 - data = resultCustomSort(xAxis, data); + if (StringUtils.containsIgnoreCase(view.getType(), "stack")) { + List list = new ArrayList<>(); + list.addAll(xAxis); + list.addAll(extStack); + data = resultCustomSort(list, data); + } else { + data = resultCustomSort(xAxis, data); + } // 同比/环比计算,通过对比类型和数据设置,计算出对应指标的结果,然后替换结果data数组中的对应元素 // 如果因维度变化(如时间字段缺失,时间字段的展示格式变化)导致无法计算结果的,则结果data数组中的对应元素全置为null // 根据不同图表类型,获得需要替换的指标index array @@ -1485,21 +1492,27 @@ public class ChartViewService { extChartViewMapper.initPanelChartViewCache(panelId); } - public List getFieldData(String id, ChartExtRequest requestList, boolean cache, String fieldId) throws Exception { + public List getFieldData(String id, ChartExtRequest requestList, boolean cache, String fieldId, String fieldType) throws Exception { ChartViewDTO view = getOne(id, requestList.getQueryFrom()); List sqlData = sqlData(view, requestList, cache, fieldId); - List xAxis = gson.fromJson(view.getXAxis(), new TypeToken>() { - }.getType()); + List fieldList = new ArrayList<>(); + if (StringUtils.equalsIgnoreCase(fieldType, "xAxis")) { + fieldList = gson.fromJson(view.getXAxis(), new TypeToken>() { + }.getType()); + } else if (StringUtils.equalsIgnoreCase(fieldType, "extStack")) { + fieldList = gson.fromJson(view.getExtStack(), new TypeToken>() { + }.getType()); + } DatasetTableField field = dataSetTableFieldsService.get(fieldId); List res = new ArrayList<>(); - if (ObjectUtils.isNotEmpty(field) && xAxis.size() > 0) { + if (ObjectUtils.isNotEmpty(field) && fieldList.size() > 0) { // 找到对应维度 ChartViewFieldDTO chartViewFieldDTO = null; int index = 0; int getIndex = 0; - for (int i = 0; i < xAxis.size(); i++) { - ChartViewFieldDTO item = xAxis.get(i); + for (int i = 0; i < fieldList.size(); i++) { + ChartViewFieldDTO item = fieldList.get(i); if (StringUtils.equalsIgnoreCase(item.getSort(), "custom_sort")) {// 此处与已有的自定义字段对比 chartViewFieldDTO = item; index = i; @@ -1508,7 +1521,7 @@ public class ChartViewService { getIndex = i; } } - List sortResult = resultCustomSort(xAxis, sqlData); + List sortResult = resultCustomSort(fieldList, sqlData); if (ObjectUtils.isNotEmpty(chartViewFieldDTO) && (getIndex >= index)) { // 获取自定义值与data对应列的结果 List strings = customSort(Optional.ofNullable(chartViewFieldDTO.getCustomSort()).orElse(new ArrayList<>()), sortResult, index); diff --git a/backend/src/main/resources/db/migration/V40__1.15.sql b/backend/src/main/resources/db/migration/V40__1.15.sql index 0399731308..37325010ad 100644 --- a/backend/src/main/resources/db/migration/V40__1.15.sql +++ b/backend/src/main/resources/db/migration/V40__1.15.sql @@ -64,3 +64,7 @@ ALTER TABLE `sys_task_email` ADD COLUMN `recisetting` varchar(255) NULL COMMENT '消息渠道' AFTER `view_ids`, ADD COLUMN `conditions` longtext NULL COMMENT '仪表板条件' AFTER `recisetting`; + + +ALTER TABLE `sys_task_email` + ADD COLUMN `reci_users` varchar(255) NULL COMMENT '接收人账号' AFTER `conditions`; \ No newline at end of file diff --git a/frontend/src/views/chart/components/compare/CustomSortEdit.vue b/frontend/src/views/chart/components/compare/CustomSortEdit.vue index 1dea740cdc..3a073dcb2e 100644 --- a/frontend/src/views/chart/components/compare/CustomSortEdit.vue +++ b/frontend/src/views/chart/components/compare/CustomSortEdit.vue @@ -33,6 +33,10 @@ export default { field: { type: Object, required: true + }, + fieldType: { + type: String, + required: true } }, data() { @@ -55,7 +59,7 @@ export default { }, methods: { init() { - post('/chart/view/getFieldData/' + this.chart.id + '/' + this.panelInfo.id + '/' + this.field.id, {}).then(response => { + post('/chart/view/getFieldData/' + this.chart.id + '/' + this.panelInfo.id + '/' + this.field.id + '/' + this.fieldType, {}).then(response => { this.sortList = response.data }) }, diff --git a/frontend/src/views/chart/components/drag-item/ChartDragItem.vue b/frontend/src/views/chart/components/drag-item/ChartDragItem.vue index a88470fa5a..93f286cda5 100644 --- a/frontend/src/views/chart/components/drag-item/ChartDragItem.vue +++ b/frontend/src/views/chart/components/drag-item/ChartDragItem.vue @@ -94,6 +94,7 @@ {{ $t('chart.none') }} {{ $t('chart.asc') }} {{ $t('chart.desc') }} + {{ $t('chart.custom_sort') }}... @@ -181,8 +182,18 @@ export default { } }, sort(param) { - this.item.sort = param.type - this.$emit('onItemChange', this.item) + if (param.type === 'custom_sort') { + const item = { + index: this.index, + sort: param.type + } + this.$emit('onItemCustomSort', item) + } else { + this.item.index = this.index + this.item.sort = param.type + this.item.customSort = [] + this.$emit('onItemChange', this.item) + } }, beforeSort(type) { return { diff --git a/frontend/src/views/chart/view/ChartEdit.vue b/frontend/src/views/chart/view/ChartEdit.vue index a302147ec2..e876b24dc4 100644 --- a/frontend/src/views/chart/view/ChartEdit.vue +++ b/frontend/src/views/chart/view/ChartEdit.vue @@ -603,6 +603,7 @@ :quota-data="quota" @onItemChange="stackItemChange" @onItemRemove="stackItemRemove" + @onItemCustomSort="stackItemCustomSort" /> @@ -1074,7 +1075,7 @@ - + - + + + + + + + 0) { this.$message({ @@ -2440,6 +2457,11 @@ export default { this.view.extStack.splice(item.index, 1) this.calcData(true) }, + stackItemCustomSort(item) { + this.customSortField = this.view.extStack[item.index] + this.stackCustomSort() + }, + drillItemChange(item) { this.calcData(true) }, @@ -2692,11 +2714,6 @@ export default { }, saveCustomSort() { this.view.xaxis.forEach(ele => { - // 先将所有自定义排序的维度设置为none,再对当前维度赋值 - // if (ele.sort === 'custom_sort') { - // ele.sort = 'none' - // ele.customSort = [] - // } if (ele.id === this.customSortField.id) { ele.sort = 'custom_sort' ele.customSort = this.customSortList @@ -2706,6 +2723,23 @@ export default { this.calcData(true) }, + stackCustomSort() { + this.showStackCustomSort = true + }, + closeStackCustomSort() { + this.showStackCustomSort = false + }, + saveStackCustomSort() { + this.view.extStack.forEach(ele => { + if (ele.id === this.customSortField.id) { + ele.sort = 'custom_sort' + ele.customSort = this.customSortList + } + }) + this.closeStackCustomSort() + this.calcData(true) + }, + fieldEdit(param) { switch (param.type) { case 'ds':