Commit 63a3ebc2 authored by yht15023815643's avatar yht15023815643

Merge branch 'zuhuduan' of http://192.168.60.201/root/dsk-operate-sys into zuhuduan

parents e090e8ab 5085b88f
......@@ -34,7 +34,7 @@ public class BusinessFollowRecordController extends BaseController
* 查询关联项目
*/
@GetMapping("/relate/project/{userId}")
public R<List<BusinessListVo>> selectRelateProject(@PathVariable("userId") Integer userId)
public R<List<BusinessListVo>> selectRelateProject(@PathVariable("userId") Long userId)
{
return R.ok(businessFollowRecordService.selectRelateProject(userId));
}
......@@ -43,7 +43,7 @@ public class BusinessFollowRecordController extends BaseController
* 查询关联业主企业
*/
@GetMapping("/relate/company/{userId}")
public R<List<String>> selectRelateCompany(@PathVariable("userId") Integer userId)
public R<List<String>> selectRelateCompany(@PathVariable("userId") Long userId)
{
return R.ok(businessFollowRecordService.selectRelateCompany(userId));
}
......
......@@ -34,7 +34,7 @@ public class BusinessFollowRecord extends BaseEntity
private Integer businessId;
/** 用户id */
private Integer userId;
private Long userId;
/** 用户昵称 */
private String nickName;
......
package com.dsk.biz.domain.bo;
import com.dsk.common.annotation.Excel;
import lombok.Data;
/**
......@@ -13,13 +14,16 @@ public class BusinessExcelDto {
/**
* 项目名称
*/
@Excel(name = "项目名称(必填)")
private String projectName;
/**
* 投资估算(万元)
*/
@Excel(name = "投资估算(万元)")
private String investmentAmount;
/**
* 业主单位
*/
@Excel(name = "业主单位(必填)")
private String ownerCompany;
}
......@@ -27,14 +27,14 @@ public interface BusinessFollowRecordMapper
* @param userId
* @return
*/
List<BusinessListVo> selectRelateProject(Integer userId);
List<BusinessListVo> selectRelateProject(Long userId);
/**
* 查询关联业主企业
* @param userId
* @return
*/
List<String> selectRelateCompany(Integer userId);
List<String> selectRelateCompany(Long userId);
/**
* 查询项目跟进记录
......
......@@ -63,14 +63,14 @@ public interface IBusinessFollowRecordService
* @param userId
* @return
*/
List<BusinessListVo> selectRelateProject(Integer userId);
List<BusinessListVo> selectRelateProject(Long userId);
/**
* 查询关联业主企业
* @param userId
* @return
*/
List<String> selectRelateCompany(Integer userId);
List<String> selectRelateCompany(Long userId);
/**
* 修改项目跟进记录
......
......@@ -77,12 +77,12 @@ public class BusinessFollowRecordServiceImpl implements IBusinessFollowRecordSer
}
@Override
public List<BusinessListVo> selectRelateProject(Integer userId) {
public List<BusinessListVo> selectRelateProject(Long userId) {
return businessFollowRecordMapper.selectRelateProject(userId);
}
@Override
public List<String> selectRelateCompany(Integer userId) {
public List<String> selectRelateCompany(Long userId) {
return businessFollowRecordMapper.selectRelateCompany(userId);
}
......
......@@ -11,6 +11,7 @@ import com.dsk.biz.domain.bo.BusinessExcelDto;
import com.dsk.biz.domain.bo.BusinessListDto;
import com.dsk.biz.domain.bo.CustomerBusinessSearchDto;
import com.dsk.biz.domain.vo.*;
import com.dsk.biz.utils.ExcelUtils;
import com.dsk.common.annotation.DataColumn;
import com.dsk.common.annotation.DataPermission;
import com.dsk.jsk.service.EnterpriseService;
......@@ -185,7 +186,13 @@ public class BusinessInfoServiceImpl implements IBusinessInfoService {
int rowSuccess = 0;//成功条数
Integer errorCount = 0;//失败条数
List<String> result = new LinkedList();//导入结果汇总
List<BusinessExcelDto> businessInfoList = readBusinessInfoExcel.getExcelInfo(file);
List<BusinessExcelDto> businessInfoList = null;
try {
businessInfoList = new ExcelUtils<>(BusinessExcelDto.class).importExcel(file.getInputStream(), 2);
} catch (Exception e) {
e.printStackTrace();
}
// List<BusinessExcelDto> businessInfoList = readBusinessInfoExcel.getExcelInfo(file);
if (CollectionUtil.isEmpty(businessInfoList)) return AjaxResult.error("文档中无项目信息,请按照模板文档格式上传");
for (BusinessExcelDto businessInfo : businessInfoList) {
//查询已有的项目名称
......
......@@ -219,4 +219,16 @@ public class JskCombineInfoController extends BaseController {
public R combineMemberLogo(@RequestBody Map<String,Object> paramMap) {
return baseService.combineMemberLogo(paramMap);
}
/***
*@Description: 集团统计展示调用允许
*@Param:
*@return: com.dsk.common.core.domain.R
*@Author: Dgm
*@date: 2023/9/12 16:05
*/
@RequestMapping(value = "/memberCount", method = RequestMethod.POST)
public R memberCount(@RequestBody JskCombineSearchDto dto) throws Exception {
return baseService.memberCount(dto);
}
}
......@@ -6,6 +6,7 @@ import lombok.NoArgsConstructor;
import lombok.ToString;
import javax.validation.constraints.NotNull;
import java.util.List;
@Data
@ToString
......@@ -26,7 +27,7 @@ public class EnterpriseProjectBidPlanPageBody extends BasePage {
/**
* 项目类型
*/
private String buildingProjectType;
private List<String> buildingProjectType;
/*
* 排序字段:1金额倒序,2金额正序,3发布时间倒序,4发布时间正序,15预计招标时间倒序,16预计招标时间正序
......
......@@ -408,21 +408,24 @@ public class EnterpriseService {
if (body.isValidateCid()) {
return R.ok();
}
String redisKey = CacheConstants.DATA_FINANCIAL + body.getCid();
List cacheMap = RedisUtils.getCacheList(redisKey);
if (ObjectUtil.isNotEmpty(cacheMap)) {
return R.ok(cacheMap);
}
// TODO 缓存需要
// String redisKey = CacheConstants.DATA_FINANCIAL + body.getCid();
// List cacheMap = RedisUtils.getCacheList(redisKey);
// if (ObjectUtil.isNotEmpty(cacheMap)) {
// return R.ok(cacheMap);
// }
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/financialData", BeanUtil.beanToMap(body, false, false));
Integer code = MapUtils.getInteger(map, "code", 300);
if (!code.equals(HttpStatus.OK.value())) {
throw new RuntimeException();
}
Object data = map.get("data");
if (ObjectUtil.isNotEmpty(data)) {
RedisUtils.setCacheList(redisKey, (List) data);
RedisUtils.expire(redisKey, Duration.ofHours(24));
}
// Object data = map.get("data");
// if (ObjectUtil.isNotEmpty(data)) {
// RedisUtils.setCacheList(redisKey, (List) data);
// RedisUtils.expire(redisKey, Duration.ofHours(24));
// }
return BeanUtil.toBean(map, R.class);
}
......
......@@ -17,6 +17,7 @@ import com.dsk.jsk.domain.vo.JskCombineWinBidProjectExportVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
......@@ -227,4 +228,32 @@ public class JskCombineInfoService {
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/enterprise/combineMemberLogo", object);
return BeanUtil.toBean(map, R.class);
}
/***
*@Description: 集团统计展示调用允许
*@Param:
*@return: com.dsk.common.core.domain.R
*@Author: Dgm
*@date: 2023/9/12 16:05
*/
public R memberCount(JskCombineSearchDto dto) {
Map<String, Object> paramsMap = BeanUtil.beanToMap(dto, false, false);
Map<String, Object> map = dskOpenApiUtil.requestBody("/operate/combine/memberCount", paramsMap);
if (ObjectUtil.isNotEmpty(map.get("data"))) {
Map<String, Object> data = BeanUtil.beanToMap(map.get("data"));
data.put("performance", businessCount(paramsMap));
}
return BeanUtil.toBean(map, R.class);
}
public Integer businessCount(Map<String, Object> paramsMap) {
Integer performance = 0;
Map<String, Object> resMap = dskOpenApiUtil.requestBody("/nationzj/project/combine/projectList", paramsMap);
Integer code = MapUtils.getInteger(resMap, "code", 300);
Map data = MapUtils.getMap(resMap, "data", null);
if (code.equals(HttpStatus.OK.value())) {
performance = MapUtils.getInteger(data, "totalCount", 0);
}
return performance;
}
}
......@@ -24,3 +24,11 @@ export const historyClaim= function historyClaim(name) {
method: 'Put',
})
}
//获取大司空open 插件访问token
export function dskAccessToken() {
return request({
url: '/system/config/dsk/accessToken',
method: 'get',
})
}
import request from "@/utils/request";
//企业数据统计
export function statistic(data) {
return request({
url: '/enterprise/statistic',
method: 'post',
data: data
})
}
// 集团logo
export function combineMemberLogo(data) {
return request({
url: '/combine/info/combineMemberLogo',
method: 'post',
data: data
})
}
// 集团成员列表
export function memberList(data) {
return request({
......
import request from "@/utils/request";
// 获取用户详细信息
export function getInfo() {
return request({
url: '/getInfo',
method: 'get'
})
}
// 集团中标统计
export function countByCompany(data) {
return request({
......
......@@ -99,7 +99,7 @@ export default {
type: 'warning'
}).then(() => {
this.$store.dispatch('LogOut').then(() => {
localStorage.removeItem('views') //清空导航栏上的数据
sessionStorage.removeItem('views') //清空导航栏上的数据
location.href = '/index';
})
}).catch(() => {});
......@@ -111,7 +111,7 @@ export default {
setToken(res.data.token)
setTenantid(id)
store.commit('SET_TOKEN', res.data.token)
localStorage.removeItem('views') //清空导航栏上的数据
sessionStorage.removeItem('views') //清空导航栏上的数据
if(this.$route.path == '/index'){
location.reload();
}else{
......
......@@ -8,8 +8,7 @@
<!--<i class="el-icon-arrow-down" v-if="!showall"></i> <i class="el-icon-arrow-up" v-if="showall"></i>-->
</div>
<el-collapse-transition>
<div class="tagslist" v-if="showall">
<draggable v-model="visitedViews" :options="dragOptions" @end="end">
<div class="tagslist" :class="{'noshow':!showall}">
<router-link
v-for="(tag, index) in visitedViews"
ref="tag"
......@@ -22,12 +21,10 @@
>
<div @click="changetags">
<i class="el-icon-check"></i>
<span :id="isActive(tag)?'tagTitle':''">{{ tag.title }}</span>
<span :id="isActive(tag)?'tagTitles':''">{{ tag.title }}</span>
</div>
</router-link>
<div class="clasall" @click="closeAllTag(selectedTag)">关闭全部标签</div>
</draggable>
</div>
</el-collapse-transition>
</div>
......@@ -154,7 +151,7 @@ export default {
// li.matched = view.matched //此条数据放出会报错
viewlist.push(li)
})
localStorage.setItem("views",JSON.stringify(viewlist))
sessionStorage.setItem("views",JSON.stringify(viewlist))
},
changetags(){
this.showall = false
......@@ -463,6 +460,8 @@ export default {
height: 24px;
}
.tagslist{
transition: all 0.2s;
display: block;
position: absolute;
left: 0;
top: 32px;
......@@ -517,6 +516,11 @@ export default {
}
}
}
.noshow{
display: none;
opacity: 0;
/*height: 0;*/
}
}
}
</style>
......
......@@ -62,12 +62,11 @@ export default {
mounted(){
this.$nextTick(() => {
this.listenSider()
})
// console.log(9999)
let views = localStorage.getItem('views')
})
let views = sessionStorage.getItem('views')
if(views!=null){
this.$store.state.tagsView.visitedViews = JSON.parse(views)
localStorage.removeItem('views')
// sessionStorage.removeItem('views')
}
},
methods: {
......
......@@ -32,6 +32,7 @@ router.beforeEach((to, from, next) => {
}).catch(err => {
store.dispatch('LogOut').then(() => {
Message.error(err)
sessionStorage.removeItem('views')
next({ path: '/' })
})
})
......
......@@ -107,6 +107,7 @@ service.interceptors.response.use(res => {
MessageBox.confirm('登录状态已过期,您可以继续留在该页面,或者重新登录', '系统提示', { confirmButtonText: '重新登录', cancelButtonText: '取消', type: 'warning' }).then(() => {
isRelogin.show = false;
store.dispatch('LogOut').then(() => {
sessionStorage.removeItem('views')
location.href = '/index';
})
}).catch(() => {
......
......@@ -17,7 +17,7 @@
@open="handleOpen">
<template v-for="(item, index) in sideRoute">
<template>
<el-menu-item :index="index.toString()" @click="handleItem(item)">{{item.title}}</el-menu-item>
<el-menu-item :index="index.toString()" :disabled="item.disabled" @click="handleItem(item)">{{item.title}}</el-menu-item>
</template>
</template>
</el-menu>
......@@ -45,6 +45,10 @@ export default {
type: Boolean,
default: true
},
statisticObj:{
type:Object,
default: {}
},
},
data() {
return {
......@@ -85,7 +89,41 @@ export default {
this.defaultRoute = JSON.parse(JSON.stringify(this.sideRoute))
},
watch:{
statisticObj:{
handler(val) {
this.sideRoute = JSON.parse(JSON.stringify(this.defaultRoute))
let arr = JSON.parse(JSON.stringify(val))
for(var i in arr){
for(var j in arr[i]){
// switch (j) {
// case 'ownershipStructure':
// if(arr[i][j]<1){
// this.sideRoute[0].disabled = true;
// }
// break;
// case 'qualification':
// if(arr[i][j]<1){
// this.sideRoute[1].disabled = true;
// }
// break;
// case 'performance':
// if(arr[i][j]<1){
// this.sideRoute[2].disabled = true;
// }
// break;
// case 'biddingAnnouncement':
// if(arr[i][j]<1){
// this.sideRoute[3].disabled = true;
// }
// break;
// default:
// break;
// }
}
}
this.defaultRoute = JSON.parse(JSON.stringify(this.sideRoute))
}
},
},
methods: {
handleOpen(key, keyPath) {
......
......@@ -341,6 +341,8 @@
}else {
this.cgblName=name;
}
this.queryParams.maxStockPercent=''
this.paramsData.maxStockPercent=''
if(this.cgblName){
if(name === '100%'){
this.queryParams.minStockPercent=1
......
<template>
<div class="app-container group-container">
<div class="header-container">
<div class="header-container" ref="header">
<div class="flex-box part-header">
<img class="header-logo" :src="require('@/assets/images/detail/company_logo.png')">
{{name || '--'}}
......@@ -8,7 +8,7 @@
</div>
<div class="flex-box group-main" ref="contentData">
<div class="group-left">
<side-bar ref="sidebar" @currentPath="showPartPage" :pathName="currentPath.pathName" :customerId="customerId"/>
<side-bar ref="sidebar" :statisticObj="statisticObj" @currentPath="showPartPage" :pathName="currentPath.pathName" :customerId="customerId"/>
</div>
<div class="group-right">
<div id="groupBox" v-if="customerId">
......@@ -30,6 +30,7 @@
import Performance from "./component/performance"
import Zhaobiao from "./component/zhaobiao"
import { infoHeader } from '@/api/detail/party-a/index'
import {combineMemberLogo,statistic} from '@/api/detail/groupAccount/groupAccount'
import elementResizeDetectorMaker from "element-resize-detector"
export default {
name: 'GroupAccount',
......@@ -40,19 +41,29 @@
return{
customerId: '', //集团Id(测试默认'81de7ca2a967d91c2afad9cb5fc30e6d')
companyInfo: {},
statisticObj: {},
cooDetail: {},
currentPath: {
pathName: 'members' //默认展示页
},
isCompany: false,
isSkeleton: false,
name:''
name:'',
}
},
created() {
if (this.$route.params.id) { // customerId
this.customerId = this.$route.params.id
}
combineMemberLogo({combineId: this.customerId}).then(res=>{
console.log(res.data)
})
statistic({companyId: this.$route.query.cid}).then(res=>{
console.log(res.data)
if(res.code==200){
this.statisticObj = res.data
}
})
// if (this.$route.query.path) { // 获取跳转对应板块
// this.currentPath.pathName = this.$route.query.path
// }
......@@ -60,6 +71,8 @@
this.name=this.$route.query.name ? this.$route.query.name : '中建集团'
},
mounted(){
// this.mainWidth=this.$refs.header.offsetWidth;
// this.width=this.$refs.contentData.offsetWidth -160;
},
methods: {
showPartPage(e){
......@@ -80,8 +93,9 @@
}
.group-main{
margin-top: 12px;
position: fixed;
width: calc(100% - 192px);
/*position: fixed;*/
width: 100%;
/*width: calc(100% - 192px);*/
height: calc(100vh - 155px);
overflow-y: auto;
align-items: initial;
......@@ -91,6 +105,7 @@
padding-bottom: 16px;
position: fixed;
background: #FFFFFF;
width: 144px;
}
.group-right{
min-width: 1088px;
......
<template>
<!-- <div style="width:calc(100% - 100px);" @click="showlist = false"> -->
<div class="app-container enterprise_contatiner" @click="showlist = false">
<div class="title_wrap">
<div class="enterprise_title">
......@@ -347,7 +347,7 @@ export default {
search(page=1){
this.page = page;
if(!this.companyName.trim()){
return
return
}
let data = {
keyword:this.companyName,
......@@ -377,13 +377,13 @@ export default {
return this.$message.warning("抱歉,没找到相关数据,建议调整关键词或筛选条件,重新搜索")
}
let item = this.searchList[0]
this.$router.push({path:`/groupAccount/${item.combineId}?name=${item.combineName.replace(new RegExp("<font color='#FF204E'>", 'g'),'').replace(new RegExp("</font>", 'g'),'')}`})
this.$router.push({path:`/groupAccount/${item.combineId}?name=${item.combineName.replace(new RegExp("<font color='#FF204E'>", 'g'),'').replace(new RegExp("</font>", 'g'),'')}&cid=${item.combineMemberCid}`})
},
selCompany(item = this.searchList[0]){
if(!item){
return this.$message.warning("抱歉,没找到相关数据,建议调整关键词或筛选条件,重新搜索")
}
this.$router.push({path:`/groupAccount/${item.combineId}?name=${item.combineName.replace(new RegExp("<font color='#FF204E'>", 'g'),'').replace(new RegExp("</font>", 'g'),'')}`})
this.$router.push({path:`/groupAccount/${item.combineId}?name=${item.combineName.replace(new RegExp("<font color='#FF204E'>", 'g'),'').replace(new RegExp("</font>", 'g'),'')}&cid=${item.combineMemberCid}`})
},
}
}
......@@ -658,5 +658,5 @@ export default {
}
}
}
}
</style>
\ No newline at end of file
}
</style>
......@@ -45,7 +45,7 @@
</el-col>
<el-col :span="8">
<div class="user" @click="handleChange">
<h3>刘毅<span>总经理</span></h3>
<h3>{{nickName}}<span>总经理</span></h3>
<p>您好,祝您工作顺利每一天</p>
</div>
</el-col>
......@@ -478,7 +478,7 @@
import CustomTimeSelect from './component/CustomTimeSelect'
import CustomMoneySelect from './component/CustomMoneySelect'
import skeleton from './component/skeleton'
import { countByCompany,bidRank,bigWinningBidsPage,bigBidPage } from '@/api/index'
import { countByCompany,bidRank,bigWinningBidsPage,bigBidPage,getInfo } from '@/api/index'
import { getUipIdByCid } from '@/api/macro/macro'
import api from '@/api/radar/radar.js';
export default {
......@@ -694,10 +694,12 @@ export default {
timePlaceholder:'中标日期',
show_page:true,
MaxPage:500,
nickName:''
};
},
created() {
this.searchDic()
this.getInfo()
this.dataRegion()
this.$nextTick(() => {
this.getCountByCompany()
......@@ -713,6 +715,12 @@ export default {
this.projectType = res.projectType;
}).catch(error=>{});
},
getInfo(){
getInfo().then(res=>{
console.log(res)
this.nickName=res.data.user.nickName
}).catch(error=>{});
},
getCountByCompany(){
let params={};
if(this.queryParams.time.length > 1){
......
......@@ -76,7 +76,7 @@ export default {
tableData:[],
tableLoading: false,
pageIndex: 1,
pageSize: 20,
pageSize: 50,
tableDataTotal: 0,
show_page:true,
MaxPage:500,
......
......@@ -118,7 +118,7 @@ export default {
tableData: [],
tableLoading: false,
pageIndex: 1,
pageSize: 20,
pageSize: 50,
tableDataTotal: null,
aptitudeCodeList:[],
aptitudeType:'',
......
......@@ -145,7 +145,7 @@
tableData: [],
tableLoading: false,
pageIndex: 1,
pageSize: 20,
pageSize: 50,
tableDataTotal: null,
show_page:true,
MaxPage:500,
......
......@@ -314,7 +314,7 @@ export default {
tableData:[],
tableLoading: false,
pageIndex: 1,
pageSize: 20,
pageSize: 50,
tableDataTotal: null,
selected:[],
xzdjCalss:'',
......
......@@ -125,30 +125,38 @@
</div>
</div>
</div>
<div class="tables" style="margin-top: 0" v-if="recordlist.rows && recordlist.rows.length == 0">
<div class="empty">
<img class="img" src="@/assets/images/project/empty.png">
<div class="p1">抱歉,您还未添加跟进动态</div>
</div>
</div>
<div class="tables" v-if="recordlist.total>pageSize">
<div class="bottems">
<el-pagination
background
:page-size="pageSize"
:current-page="pageNum"
@current-change="handleCurrentChange"
layout="prev, pager, next"
:total="recordlist.total">
</el-pagination>
<div class="bottems">
<el-pagination
background
:page-size="pageSize"
:current-page="pageNum"
@current-change="handleCurrentChange"
layout="prev, pager, next"
:total="recordlist.total">
</el-pagination>
</div>
</div>
</div>
</div>
</div>
</el-card>
</div>
</template>
<script>
import "@/assets/styles/project.scss"
import {getFollowList,addFollowRecord,getUserList,delFollowRecord} from '@/api/custom/custom'
import {getGJJL,addGJJL,delGJJL,relateProject,allRecord} from '@/api/project/project'
import {getEnterprise,getDictType,} from '@/api/main'
import '@/assets/styles/project.scss'
import { addFollowRecord, delFollowRecord, getFollowList, getUserList } from '@/api/custom/custom'
import { addGJJL, allRecord, delGJJL, getGJJL, relateProject } from '@/api/project/project'
import { getDictType, getEnterprise } from '@/api/main'
import skeleton from './skeleton'
export default {
components:{skeleton},
props:{
......
......@@ -203,20 +203,26 @@
},
getList(){
this.isSkeleton = true
getZLWD(this.param).then(res=>{
this.fileDatas = res
getZLWD(this.param).then(res => {
this.isSkeleton = false
if(this.fileDatas.rows!=null && this.fileDatas.rows.length>0){
this.fileDatas.rows.forEach(item=>{
let names = item.filePath.split('/')
item.name = names[names.length-1]
let types = item.name.split('.')
item.type = types.length>1?types[1]:'file'
if(item.type == 'xls' || item.type == 'xlsx' )
item.type = 'excel'
if(item.type == 'doc' || item.type == 'docx' )
item.type = 'word'
})
if (res.code == 200) {
this.fileDatas = res
if (this.fileDatas.rows != null && this.fileDatas.rows.length > 0) {
this.fileDatas.rows.forEach(item => {
let names = item.filePath.split('/')
item.name = names[names.length - 1]
let types = item.name.split('.')
item.type = types.length > 1 ? types[1] : 'file'
if (item.type == 'xls' || item.type == 'xlsx') {
item.type = 'excel'
}
if (item.type == 'doc' || item.type == 'docx') {
item.type = 'word'
}
})
}
}else{
this.fileDatas.total = 0
}
})
},
......
......@@ -72,7 +72,7 @@ public class SysMenuServiceImpl implements ISysMenuService {
QueryWrapper<SysMenu> wrapper = Wrappers.query();
wrapper.eq("sur.user_id", userId)
.like(StringUtils.isNotBlank(menu.getMenuName()), "m.menu_name", menu.getMenuName())
.eq("m.visible", 0)
//.eq("m.visible", 0)
.eq("m.status", 0)
.orderByAsc("m.parent_id")
.orderByAsc("m.order_num");
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment