想要H5页面中实现升序,降序的排序功能 :

问题 :
点击排序按钮只可以降序,不能升序
原因 :
小于0时无法排序, 原因是返回值为 int 类型, 小于0的值变为0,所以无法排序

但是在解决这个问题同时发现了另外一个问题, 因为要做分页处理(每页数据为15条), 数据超过15条数据时, 那么排序只会排当前页查到的数据, 前面页码数据不参与排序
所以需要在数据库中排序 而不能在 代码中排序(在代码中排序需要将所有数据全部查询出来, 数据过大时会对数据产生影响,不建议使用)
代码 :
1 @Secured(‘permitAll‘) 2 def piles(Integer page, Integer size, String searchTerm, String sort, String order, Boolean online) { 3 page = page ?: 0 4 size = size ?: 15 5 sort = sort ?: ‘income‘ 6 order = order ?: ‘desc‘ 7 def user = securityService.currUser 8 def piles = ChargePile.createCriteria().list { 9 eq ‘deleted‘, false10 if (online) {11 eq ‘status‘, ModelConst.CHARGE_PILE__STATUS__ONLINE12 } else {13 eq ‘status‘, ModelConst.CHARGE_PILE__STATUS__OFFLINE14 }15 chargeSite {16 eq ‘platform‘, PlatformHolder.loadPlatform()17 eq ‘status‘, ModelConst.CHARGE_SITE__STATUS__APPROVED18 agent {19 eq ‘user‘, user20 }21 }22 if (searchTerm) {23 searchTerm = ‘%‘ + searchTerm + ‘%‘24 or {25 ilike ‘pileNo‘, searchTerm26 chargeSite {27 ilike ‘name‘, searchTerm28 }29 }30 }31 projections {32 property ‘id‘33 property ‘pileNo‘34 property ‘location‘35 property ‘portCount‘36 chargeSite {37 property ‘name‘38 property ‘address‘39 property ‘addressDetail‘40 }41 property ‘status‘42 property ‘type‘43 }44 maxResults size45 firstResult page * size46 }.collect { Object[] it ->47 def pileId = it[0]48 def pile = ChargePile.load(pileId as Long)49 def pileReport = PileReport.createCriteria().get {50 eq ‘type‘, ModelConst.REPORT__TYPE__DATE51 eq ‘time‘, TimeUtils.getYesterdayyyyyMMdd()52 eq ‘chargePile‘, pile53 } as PileReport54 [55 id : pileId,56 pileNo : it[1],57 total : it[3],58 siteName: it[4],59 address : AddressUtils.getFullAddress(it[5] as District, it[6] as String).concat(it[2] as String),60 status : it[7],61 busy : it[7] == ModelConst.CHARGE_PILE__STATUS__ONLINE ? pileCacheService.busyPortCount(it[0] as long, it[3] as int) : 0,62 broken : it[7] == ModelConst.CHARGE_PILE__STATUS__ONLINE ? pileCacheService.brokenPortCount(it[0] as long, it[3] as int) : 0,63 avaliable : it[7] == ModelConst.CHARGE_PILE__STATUS__ONLINE ? pileCacheService.avaliablePortCount(it[0] as long, it[3] as int) : 0,64 usedRate: pileReport ? String.format(‘%.2f‘, pileReport?.useRate * 100) : ‘0‘, // 排序字段65 income : pileReport ? String.format(‘%.2f‘, pileReport?.pileIncomeAmount / 100) : ‘0.00‘, // 排序字段66 ]67 } as List68 def result = [69 piles: listSort(piles, sort, order), // 上述图片中方法70 online: countPiles(ModelConst.CHARGE_PILE__STATUS__ONLINE),71 offline: countPiles(ModelConst.CHARGE_PILE__STATUS__OFFLINE)72 ]73 render result as JSON
通过 Bean Searcher 在数据库中进行排序 代码如下 :
1 @SearchBean(tables = ‘‘‘charge_pile p // sql语句 2 left join pile_report r on r.charge_pile_id = p.id and r.type = 1 and r.time = :time // on后面是对局部条件做限制 3 left join charge_site s on p.charge_site_id = s.id 4 left join agent a on s.agent_id = a.id ‘‘‘, 5 joinCond = ‘‘‘p.deleted = 0 and a.user_id = :userId and s.platform_id = :platformId and // joinCond 相当于在sql中的where, where后面是对全局做限制 6 (s.name like :search or p.pile_no like :search)‘‘‘) // 实现条件搜索(设备名称或设备编号) 7 class PileReportBean implements BeanAware { 8 9 @DbField(‘p.id‘)10 Long id11 12 @DbField(‘p.pile_no‘)13 String pileNo14 15 @DbField(‘p.location‘)16 String location17 18 @DbField(‘p.port_count‘)19 Integer portCount20 21 @DbField(‘p.status‘)22 int status23 24 @DbField(‘p.type‘)25 int type26 27 @DbField(‘s.name‘)28 String name29 30 @DbField(‘s.address_detail‘)31 String address32 33 @DbField(‘r.use_rate‘)34 BigDecimal useRate35 36 @DbField(‘r.pile_income_amount‘)37 Integer pileIncomeAmount38 39 40 @Override41 void afterAssembly() {42 43 }44 45 }
控制层代码 :
1 @Secured(‘permitAll‘) //权限 所有人可以访问 2 def piles(Integer page, Integer size, String searchTerm, String sort, String orderMode, Boolean online) { 3 page = page ?: 0 4 size = size ?: 15 5 sort = sort ?: ‘pileIncomeAmount‘ 6 orderMode = orderMode ?: ‘desc‘ 7 def user = securityService.currUser 8 log.info("user:${user},") 9 def status = online ? 1 : 210 def params = [ // sql的 wehre 条件11 platformId : PlatformHolder.loadPlatform().id,12 time : TimeUtils.getYesterdayyyyyMMdd(),13 userId : user.id,14 status : status,15 search : ‘%‘ +searchTerm + ‘%‘, // 搜索条件(通过前端传入)16 sort : sort, // 排序字段(前端传入)17 order : orderMode, // 排序方式(desc or asc)18 max : size,19 offset : page20 ]21 22 def piles = searcher.search(PileReportBean, params)23 piles = piles.dataList?.collect { it ->24 [25 id : it.id,26 pileNo : it.pileNo,27 total : it?.portCount,28 siteName : it.name,29 address : it.address,30 status : it.status,31 busy : it.status == ModelConst.CHARGE_PILE__STATUS__ONLINE ? pileCacheService.busyPortCount(it.id, it.portCount) : 0,32 broken : it.status == ModelConst.CHARGE_PILE__STATUS__ONLINE ? pileCacheService.brokenPortCount(it.id, it.portCount) : 0,33 avaliable : it.status == ModelConst.CHARGE_PILE__STATUS__ONLINE ? pileCacheService.avaliablePortCount(it.id, it.portCount) : 0,34 useRate : it.useRate ? String.format(‘%.2f‘, it?.useRate * 100) : ‘0‘,35 pileIncomeAmount: it.pileIncomeAmount ? String.format(‘%.2f‘, it?.pileIncomeAmount / 100) : ‘0.00‘36 ]37 }38 def result = [39 piles: piles,40 online: countPiles(ModelConst.CHARGE_PILE__STATUS__ONLINE),41 offline: countPiles(ModelConst.CHARGE_PILE__STATUS__OFFLINE)42 ]43 render result as JSON44 }
以上 方法解决 本次所遇到的 排序问题