Browse Source

app端批量交费

pengjing 9 months ago
parent
commit
d04aedf399
45 changed files with 1002 additions and 26 deletions
  1. 59 0
      parth5/parth5/src/app/api/partyuser/partydues/index.ts
  2. 15 0
      parth5/parth5/src/app/api/system/dictionary/index.ts
  3. 57 0
      parth5/parth5/src/app/comm/modal/alert/index.ts
  4. 12 0
      parth5/parth5/src/app/routes/partyDues.ts
  5. 7 7
      parth5/parth5/src/app/routes/partyUser.ts
  6. 17 1
      parth5/parth5/src/app/service/config.service.ts
  7. 41 0
      parth5/parth5/src/app/views/pages/partyuser/party-dues/detail/detail.component.html
  8. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-dues/detail/detail.component.scss
  9. 56 0
      parth5/parth5/src/app/views/pages/partyuser/party-dues/detail/detail.component.ts
  10. 73 0
      parth5/parth5/src/app/views/pages/partyuser/party-dues/edit/edit.component.html
  11. 74 0
      parth5/parth5/src/app/views/pages/partyuser/party-dues/edit/edit.component.scss
  12. 153 0
      parth5/parth5/src/app/views/pages/partyuser/party-dues/edit/edit.component.ts
  13. 65 0
      parth5/parth5/src/app/views/pages/partyuser/party-dues/party-dues.component.html
  14. 47 0
      parth5/parth5/src/app/views/pages/partyuser/party-dues/party-dues.component.scss
  15. 139 0
      parth5/parth5/src/app/views/pages/partyuser/party-dues/party-dues.component.ts
  16. 51 0
      parth5/parth5/src/app/views/pages/partyuser/party-dues/selectuser/selectuser.component.html
  17. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-dues/selectuser/selectuser.component.scss
  18. 103 0
      parth5/parth5/src/app/views/pages/partyuser/party-dues/selectuser/selectuser.component.ts
  19. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/democracy/democracy.component.html
  20. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/democracy/democracy.component.scss
  21. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/democracy/democracy.component.ts
  22. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/detail.component.html
  23. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/detail.component.scss
  24. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/detail.component.ts
  25. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/partyhelp/partyhelp.component.html
  26. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/partyhelp/partyhelp.component.scss
  27. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/partyhelp/partyhelp.component.ts
  28. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/punish/punish.component.html
  29. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/punish/punish.component.scss
  30. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/punish/punish.component.ts
  31. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/reward/reward.component.html
  32. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/reward/reward.component.scss
  33. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/reward/reward.component.ts
  34. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/train/train.component.html
  35. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/train/train.component.scss
  36. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/detail/train/train.component.ts
  37. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/party-user.component.html
  38. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/party-user.component.scss
  39. 0 0
      parth5/parth5/src/app/views/pages/partyuser/party-user/party-user.component.ts
  40. 3 1
      parth5/parth5/src/app/views/tapp/tab-main/tab-main.module.ts
  41. 3 1
      parth5/parth5/src/app/views/tapp/tab-main/tab-main.route.ts
  42. 9 7
      src/main/java/com/ghsc/partybuild/controller/app/AppPartyController.java
  43. 1 1
      src/main/java/com/ghsc/partybuild/service/PublicityService.java
  44. 8 2
      src/main/java/com/ghsc/partybuild/service/impl/PublicityServiceImpl.java
  45. 9 6
      src/main/resources/mapping/PublicityCQuery.xml

+ 59 - 0
parth5/parth5/src/app/api/partyuser/partydues/index.ts

@@ -0,0 +1,59 @@
+import {Injectable} from "@angular/core";
+import {Observable} from "rxjs";
+import {ConfigService, RequsetData} from "../../../service/config.service";
+import {UserService} from "../../../service/user.service";
+
+export interface reqParams {
+  pageIndex: number;
+  pageSize: number;
+  ssdzzdm: string;
+  xm: string;
+  year: number;
+  month: number;
+}
+
+
+@Injectable({providedIn: 'root'})
+export class PartyDuesApi {
+  public getNotPayUserListUrl = '/appApi/party/getPartyDuesUserListOfAddfee';
+
+  constructor(private configService: ConfigService, private userService: UserService) {
+  }
+
+  getList(params: reqParams): Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/appApi/party/getUserDuesList', params);
+  }
+
+  deleteDetail(detailId: string): Observable<RequsetData> {
+    return this.configService.HttpPostRomote('/appApi/party/deleteDuesById', {
+      id: detailId,
+      userId: this.userService.GetUser().userid
+    });
+  }
+
+  getNotPayUserList(year: number, month: number) {
+    return this.configService.HttpGetRomote(this.getNotPayUserListUrl, {year: year, month: month});
+  }
+
+  saveDuesList(duesList: any) {
+    return this.configService.HttpPostRomote('/appApi/party/savePartyDuesMulti', {
+      userList: JSON.stringify(duesList),
+      userId: this.userService.GetUser().userid,
+      userName: this.userService.GetUser().username
+    });
+  }
+
+  getDataByDetailId(detailId: string) {
+    return this.configService.HttpGetRomote('/appApi/party/getUserduesDetailById', {detailId: detailId});
+  }
+
+  savePartyduesDetail(data: any) {
+    return this.configService.HttpPostRomote('/appApi/party/savePartyduesDetail', {
+      dataModel: data,
+      userId: this.userService.GetUser().userid,
+      userName: this.userService.GetUser().username
+    })
+  }
+
+}
+

+ 15 - 0
parth5/parth5/src/app/api/system/dictionary/index.ts

@@ -0,0 +1,15 @@
+import {Injectable} from "@angular/core";
+import {Observable} from "rxjs";
+import {ConfigService, RequsetData} from "../../../service/config.service";
+
+@Injectable({providedIn: 'root'})
+export class DictionaryApi {
+  constructor(private configService: ConfigService) {
+  }
+
+  getDictionaryList(dicTypeKey: string): Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/appApi/dic/getDictionaryList', {dicTypeKey: dicTypeKey});
+  }
+
+}
+

+ 57 - 0
parth5/parth5/src/app/comm/modal/alert/index.ts

@@ -0,0 +1,57 @@
+import {Injectable} from "@angular/core";
+import {AlertController, LoadingController} from "@ionic/angular";
+
+@Injectable({
+  providedIn: 'root'
+})
+export class AlertModal {
+  constructor(private alertController: AlertController, private loadingController: LoadingController) {
+
+  }
+
+  async loading(msg: string): Promise<HTMLIonLoadingElement> {
+    const loading = await this.loadingController.create({
+      message: msg,
+      spinner: 'circles'
+    });
+
+    await loading.present();
+
+    return loading;
+  }
+
+  async alert(msg: string) {
+    const alert = await this.alertController.create({
+      header: '提示',
+      subHeader: '',
+      message: msg,
+      buttons: ['确定']
+    });
+
+    await alert.present();
+  }
+
+  async confirm(msg: string, handler) {
+    const alert = await this.alertController.create({
+      header: '提示',
+      message: '<strong>' + msg + '</strong>',
+      buttons: [
+        {
+          text: '关闭',
+          role: 'cancel',
+          cssClass: 'secondary',
+          handler: () => {
+
+          }
+        }, {
+          text: '确定',
+          handler: handler
+        }
+      ]
+    });
+
+    await alert.present();
+  }
+
+
+}

+ 12 - 0
parth5/parth5/src/app/routes/partyDues.ts

@@ -0,0 +1,12 @@
+import {Routes} from "@angular/router";
+import {PartyDuesComponent} from "../views/pages/partyuser/party-dues/party-dues.component";
+import {EditComponent} from "../views/pages/partyuser/party-dues/edit/edit.component";
+import {DetailComponent} from "../views/pages/partyuser/party-dues/detail/detail.component";
+
+const routes: Routes = [
+  {path: 'partyDues', component: PartyDuesComponent},
+  {path: 'partyDues/detail', component: DetailComponent},
+  {path: 'partyDues/edit', component: EditComponent},
+];
+
+export default routes;

+ 7 - 7
parth5/parth5/src/app/routes/partyUser.ts

@@ -1,11 +1,11 @@
 import {Routes} from "@angular/router";
-import {PartyUserComponent} from "../views/pages/party/party-user/party-user.component";
-import {DetailComponent} from "../views/pages/party/party-user/detail/detail.component";
-import {DemocracyComponent} from "../views/pages/party/party-user/detail/democracy/democracy.component";
-import {PartyhelpComponent} from "../views/pages/party/party-user/detail/partyhelp/partyhelp.component";
-import {PunishComponent} from "../views/pages/party/party-user/detail/punish/punish.component";
-import {RewardComponent} from "../views/pages/party/party-user/detail/reward/reward.component";
-import {TrainComponent} from "../views/pages/party/party-user/detail/train/train.component";
+import {PartyUserComponent} from "../views/pages/partyuser/party-user/party-user.component";
+import {DetailComponent} from "../views/pages/partyuser/party-user/detail/detail.component";
+import {DemocracyComponent} from "../views/pages/partyuser/party-user/detail/democracy/democracy.component";
+import {PartyhelpComponent} from "../views/pages/partyuser/party-user/detail/partyhelp/partyhelp.component";
+import {PunishComponent} from "../views/pages/partyuser/party-user/detail/punish/punish.component";
+import {RewardComponent} from "../views/pages/partyuser/party-user/detail/reward/reward.component";
+import {TrainComponent} from "../views/pages/partyuser/party-user/detail/train/train.component";
 
 const routes: Routes = [
   {path: 'partyUser', component: PartyUserComponent},

+ 17 - 1
parth5/parth5/src/app/service/config.service.ts

@@ -1,5 +1,5 @@
 import {Injectable, Optional} from '@angular/core';
-import {HttpClient} from '@angular/common/http';
+import {HttpClient, HttpParams} from '@angular/common/http';
 import {HttpErrorResponse, HttpResponse, HttpHeaders} from '@angular/common/http';
 
 import {Observable, throwError} from 'rxjs';
@@ -54,8 +54,24 @@ export class ConfigService {
     return cf;
   };
 
+  //过滤null或undefined的参数
+  cleanedParams(params?: any) {
+    let cleanedParams = {};
+    if (params) {
+      Object.keys(params).forEach(x => {
+        if (params[x] != null && params[x] != undefined) {
+          cleanedParams[x] = params[x];
+        }
+      });
+    }
+
+    return cleanedParams;
+  }
+
   HttpGetRomote(url: string, params?: any): Observable<RequsetData> {
 
+    params = this.cleanedParams(params);
+
     const httpGetSubscriber = new Observable<RequsetData>((observer) => {
       this.GetConfig().subscribe((cfdata: Config) => {
         var remoteUrl = cfdata.webServerHost + url;

+ 41 - 0
parth5/parth5/src/app/views/pages/partyuser/party-dues/detail/detail.component.html

@@ -0,0 +1,41 @@
+<ion-header class="header-theme2">
+  <ion-toolbar>
+    <ion-label class="title-center">党费详情</ion-label>
+    <ion-buttons slot="start">
+      <ion-back-button icon="ios-back2" text="" mode="md"></ion-back-button>
+    </ion-buttons>
+  </ion-toolbar>
+</ion-header>
+<ion-content>
+  <form #dataForm="ngForm" class="form-table">
+    <ion-list>
+      <ion-item mode="md">
+        <ion-label>姓名</ion-label>
+        <ion-input #money="ngModel" name="username" id="username" [(ngModel)]="duesModel.username" readonly></ion-input>
+      </ion-item>
+      <ion-item mode="md">
+        <ion-label>年份</ion-label>
+        <ion-input #money="ngModel" name="year" id="year" [(ngModel)]="duesModel.year" readonly></ion-input>
+      </ion-item>
+      <ion-item mode="md">
+        <ion-label>月份</ion-label>
+        <ion-input #money="ngModel" name="month" id="month" [(ngModel)]="detailModel.month" readonly></ion-input>
+      </ion-item>
+      <ion-item mode="md">
+        <ion-label>交纳金额<span class="danger">*</span></ion-label>
+        <ion-input #money="ngModel" name="money" id="money" [(ngModel)]="detailModel.money" required></ion-input>
+      </ion-item>
+      <!--<ion-item mode="md">
+        <ion-label>特殊党费</ion-label>
+        <ion-input #specialexpenses="ngModel" name="specialexpenses" id="specialexpenses" [(ngModel)]="detailModel.specialexpenses"></ion-input>
+      </ion-item>-->
+    </ion-list>
+    <ion-toolbar class="toolbar-center">
+      <ion-button slot="end" color="danger" mode="ios"
+                  (click)="save()" [disabled]="!dataForm.form.valid">
+        提交
+      </ion-button>
+    </ion-toolbar>
+  </form>
+</ion-content>
+

parth5/parth5/src/app/views/pages/party/party-user/party-user.component.scss → parth5/parth5/src/app/views/pages/partyuser/party-dues/detail/detail.component.scss


+ 56 - 0
parth5/parth5/src/app/views/pages/partyuser/party-dues/detail/detail.component.ts

@@ -0,0 +1,56 @@
+import {Component, OnInit} from '@angular/core';
+import {DatePipe} from "@angular/common";
+import {ActivatedRoute, Router} from "@angular/router";
+import {ConfigService, RequsetData} from "../../../../../service/config.service";
+import {UserService} from "../../../../../service/user.service";
+import {AlertModal} from "../../../../../comm/modal/alert";
+import {PartyDuesApi} from "../../../../../api/partyuser/partydues";
+
+@Component({
+  selector: 'app-detail',
+  templateUrl: './detail.component.html',
+  styleUrls: ['./detail.component.scss'],
+})
+export class DetailComponent implements OnInit {
+
+  detailModel: any = {};
+  duesModel: any = {};
+
+  constructor(private datePipe: DatePipe, private router: Router, private routeInfo: ActivatedRoute, private configService: ConfigService, private userService: UserService,
+              public alertModal: AlertModal, private partyDuesApi: PartyDuesApi) {
+  }
+
+  ngOnInit() {
+    this.routeInfo.queryParams.subscribe(params => {
+      this.detailModel.detailid = params['id'];
+      this.getData();
+    });
+  }
+
+  getData() {
+    this.partyDuesApi.getDataByDetailId(this.detailModel.detailid).subscribe((data: RequsetData) => {
+      if (data.success) {
+        this.detailModel = data.item;
+        this.duesModel = data.extdata.duesModel;
+      }
+    });
+  }
+
+  save() {
+    this.alertModal.loading("提交中...").then((loading) => {
+      this.partyDuesApi.savePartyduesDetail(this.detailModel).subscribe((data: RequsetData) => {
+        loading.dismiss();
+
+        if (data.success) {
+          this.back();
+        }
+        this.alertModal.alert(data.msg);
+      });
+    });
+  }
+
+  back() {
+    this.router.navigate(['../../partyDues'], {relativeTo: this.routeInfo, queryParams: {random: Math.random()}});
+  }
+
+}

+ 73 - 0
parth5/parth5/src/app/views/pages/partyuser/party-dues/edit/edit.component.html

@@ -0,0 +1,73 @@
+<ion-header class="header-theme2">
+  <ion-toolbar>
+    <ion-label class="title-center">批量交党费</ion-label>
+    <ion-buttons slot="start">
+      <ion-back-button icon="ios-back2" mode="md"></ion-back-button>
+    </ion-buttons>
+  </ion-toolbar>
+</ion-header>
+<ion-content>
+  <ion-list>
+    <ion-item detail>
+      <ion-label>党支部名称</ion-label>
+      <app-partyselect [(dzzdm)]="dataModel.dzzdm" [(dzzmc)]="dataModel.dzzmc"
+                       (dzzdmChange)="getUserList()"></app-partyselect>
+    </ion-item>
+    <ion-item>
+      <ion-label style="flex:unset;">年份</ion-label>
+      <ion-select okText="确定" cancelText="取消" style="width: 80px;"
+                  interface="action-sheet" [(ngModel)]="dataModel.year"
+                  (ionChange)="yearChange($event)">
+        <ion-select-option [value]="it.dickey" *ngFor="let it of years">{{it.dicvalue}}
+        </ion-select-option>
+      </ion-select>
+      <ion-label style="flex:unset;margin-left: 50px;">月份</ion-label>
+      <ion-select okText="确定" cancelText="取消"
+                  interface="action-sheet" [(ngModel)]="dataModel.month"
+                  (ionChange)="monthChange($event)">
+        <ion-select-option [value]="it" *ngFor="let it of months">{{it}}
+        </ion-select-option>
+      </ion-select>
+    </ion-item>
+  </ion-list>
+  <ion-item class="grid-title">
+    <ion-label>应缴党费明细</ion-label>
+    <ion-button (click)="selectUser()" fill="clear" size="">
+      <ion-icon name="add-circle-outline" size="large" color="danger"></ion-icon>
+    </ion-button>
+  </ion-item>
+  <ion-grid>
+    <ion-row>
+      <ion-col>
+        姓名
+      </ion-col>
+      <ion-col>
+        交纳金额
+        <br>
+        <span> (元/月)</span>
+      </ion-col>
+      <ion-col>
+        操作
+      </ion-col>
+    </ion-row>
+    <ion-row *ngFor="let item of dataList;let idx=index">
+      <ion-col>
+        {{item.USERNAME}}
+      </ion-col>
+      <ion-input type="number" [(ngModel)]="item.MONEY" required></ion-input>
+      <ion-col class="grid-btn">
+        <span (click)="delete(idx)">删除</span>
+      </ion-col>
+    </ion-row>
+  </ion-grid>
+  <ion-item *ngIf="dataList.length==0" style="text-align: center;">
+    <ion-label><p>暂无数据</p></ion-label>
+  </ion-item>
+  <ion-toolbar class="toolbar-center">
+    <ion-button slot="end" color="danger" mode="ios"
+                (click)="save()" class="submitBtn">
+      提交
+    </ion-button>
+  </ion-toolbar>
+</ion-content>
+

+ 74 - 0
parth5/parth5/src/app/views/pages/partyuser/party-dues/edit/edit.component.scss

@@ -0,0 +1,74 @@
+ion-item {
+  --inner-border-width: 0px;
+  --border-width: 0px;
+
+  ion-label {
+    overflow: visible;
+    color: #998989;
+  }
+}
+
+ion-select, ion-input {
+  padding-top: 12px;
+}
+
+.grid-title {
+  --background: #FAFAFA !important;
+
+  ion-label {
+    color: #380F0A;
+  }
+}
+
+ion-grid {
+  padding: 0px;
+  color: #5E4545;
+
+  ion-row {
+    padding: 5px 12px;
+    border-bottom: 1px solid #F4F5F7;
+
+    ion-col {
+      display: -webkit-box;
+      -webkit-box-orient: horizontal;
+      -webkit-box-align: center;
+    }
+
+    ion-col:not(:first-child) {
+      -webkit-box-pack: center;
+      text-align: center;
+    }
+
+    ion-input{
+      background-color: #F5F5F5;
+      border-radius: 20px;
+      margin: 3px;
+      height: 30px;
+      --padding-top: 0;
+      --padding-bottom: 0;
+      --padding-start: 10px;
+    }
+
+    .grid-btn{
+      color: #007EFF;
+      cursor: pointer;
+    }
+  }
+
+  ion-row:first-child {
+    font-size: 14px;
+    color: #998989;
+  }
+
+  ion-row:not(:first-child) {
+    background-color: white;
+  }
+}
+
+app-partyselect{
+  width: 75%;
+}
+
+.submitBtn{
+  width: 100%;margin: 20px;
+}

+ 153 - 0
parth5/parth5/src/app/views/pages/partyuser/party-dues/edit/edit.component.ts

@@ -0,0 +1,153 @@
+import {Component, OnInit} from '@angular/core';
+import {DatePipe} from "@angular/common";
+import {ActivatedRoute, Router} from "@angular/router";
+import {RequsetData} from "../../../../../service/config.service";
+import {UserService} from "../../../../../service/user.service";
+import {ModalController} from "@ionic/angular";
+import {SelectuserComponent} from "../selectuser/selectuser.component";
+import {PartyDuesApi} from "../../../../../api/partyuser/partydues";
+import {DictionaryApi} from "../../../../../api/system/dictionary";
+import {AlertModal} from "../../../../../comm/modal/alert";
+
+@Component({
+  selector: 'app-edit',
+  templateUrl: './edit.component.html',
+  styleUrls: ['./edit.component.scss'],
+})
+export class EditComponent implements OnInit {
+
+  dataModel: any = {
+    'pageIndex': 1,
+    'pageSize': 1000, dzzmc: '', dzzdm: '', year: null, month: ''
+  };
+  years: any = [];
+  months: any = [];
+  dataList: any = [];
+
+  constructor(private datePipe: DatePipe, private router: Router, private routeInfo: ActivatedRoute, private userService: UserService,
+              public modalController: ModalController, private partyDuesApi: PartyDuesApi, private dictionaryApi: DictionaryApi, private alertModal: AlertModal) {
+  }
+
+  ngOnInit() {
+    this.routeInfo.queryParams.subscribe(params => {
+      this.dataModel.dzzdm = this.userService.GetUser().dataDzzdm.length <= 9 ? this.userService.GetUser().DZZDM : this.userService.GetUser().dataDzzdm;
+      this.dataModel.dzzmc = this.userService.GetUser().dataDzzdm.length <= 9 ? this.userService.GetUser().DZZMC : this.userService.GetUser().dataDzzmc;
+      this.getYearList();
+    });
+  }
+
+  getYearList() {
+    this.dictionaryApi.getDictionaryList('years').subscribe((data: RequsetData) => {
+      if (data.success) {
+        this.years = data.item;
+        for (let i = 1; i <= 12; i++) {
+          this.months.push(i);
+        }
+        this.dataModel.month = new Date().getMonth() + 1;
+        this.dataModel.year = new Date().getFullYear();
+        this.getUserList();
+      }
+    });
+  }
+
+  getUserList() {
+    this.dataList = [];
+    this.partyDuesApi.getNotPayUserList(this.dataModel.year, this.dataModel.month).subscribe((data: RequsetData) => {
+      if (data.success) {
+        this.dataList = data.item.list;
+      }
+    });
+  }
+
+  yearChange(e) {
+    this.getUserList();
+  }
+
+  monthChange(e) {
+    this.getUserList();
+  }
+
+  delete(index) {
+    this.dataList.splice(index, 1);
+  }
+
+  selectUser() {
+    this.presentModal();
+  }
+
+  save() {
+    if (this.dataList.length <= 0) {
+      this.alertModal.alert('请选择需要缴费的党员');
+      return false;
+    }
+
+    if (this.dataList.filter(it => it.MONEY == null || it.MONEY === '').length > 0) {
+      this.alertModal.alert('请填写党费');
+      return false;
+    }
+
+    //数据处理
+    var userList = [];
+    this.dataList.forEach((val, key) => {
+      userList.push({
+        partyduesid: val.PARTYDUESID,
+        month: this.dataModel.month,
+        money: val.MONEY,
+        specialexpenses: val.SPECIALEXPENSES,
+        partycode: val.PARTYCODE
+      });
+    });
+
+    this.alertModal.loading("提交中...").then((loading) => {
+      this.partyDuesApi.saveDuesList(userList).subscribe((fdata: RequsetData) => {
+        loading.dismiss();
+        if (fdata.success) {
+          this.back();
+        }
+        this.alertModal.alert(fdata.msg);
+      });
+    });
+  }
+
+  //人员选择控件
+  async presentModal() {
+    const modal = await this.modalController.create({
+      component: SelectuserComponent,
+      componentProps: {
+        'pageIndex': 1,
+        'pageSize': 30,
+        'year': this.dataModel.year,
+        'month': this.dataModel.month,
+        'dzzdm': this.dataModel.dzzdm,
+        'getUserUrl': this.partyDuesApi.getNotPayUserListUrl
+      }
+    });
+
+    await modal.present();
+
+    const {data} = await modal.onWillDismiss();
+    if (data.rtnData != null && data.rtnData.length > 0) {
+      var us = data.rtnData;
+
+      data.rtnData.forEach(item => {
+          this.dataList.push({
+            PARTYDUESID: item.PARTYDUESID,
+            USERNAME: item.USERNAME,
+            USERCODE: item.USERCODE,
+            BASENUMBER: item.BASENUMBER,
+            MONEY: item.MONEY,
+            SPECIALEXPENSES: item.SPECIALEXPENSES,
+            PARTYCODE: item.PARTYCODE
+          });
+        }
+      )
+      ;
+
+    }
+  }
+
+  back() {
+    this.router.navigate(['../../partyDues'], {relativeTo: this.routeInfo});
+  }
+
+}

+ 65 - 0
parth5/parth5/src/app/views/pages/partyuser/party-dues/party-dues.component.html

@@ -0,0 +1,65 @@
+<ion-header>
+  <ion-toolbar>
+    <ion-label>党费管理</ion-label>
+    <ion-buttons slot="start">
+      <ion-back-button icon="ios-back" mode="md"></ion-back-button>
+    </ion-buttons>
+    <ion-searchbar slot="end" mode="ios" enterkeyhint="search" placeholder="搜索党员名称" showCancelButton="never"
+                   (ionChange)="searchChange($event)"></ion-searchbar>
+  </ion-toolbar>
+  <app-partysearch [(dzzdm)]="searchParams.ssdzzdm" (dzzdmChange)="reload()"></app-partysearch>
+  <ion-item class="item-filter">
+    <ion-select okText="确定" cancelText="取消"
+                interface="action-sheet" placeholder="所有年份" [(ngModel)]="searchParams.year"
+                (ionChange)="yearChange($event)" selectedText="{{fetchYearLabel()}}年">
+      <ion-select-option value="">所有年份</ion-select-option>
+      <ion-select-option [value]="it.dickey" *ngFor="let it of yearList">{{it.dicvalue}}年
+      </ion-select-option>
+    </ion-select>
+    <ion-select okText="确定" cancelText="取消"
+                interface="action-sheet" placeholder="所有年份" [(ngModel)]="searchParams.month"
+                (ionChange)="monthChange($event)" style="margin-left: 30px;" selectedText="{{fetchMonthLabel()}}月">
+      <ion-select-option value="">所有月份</ion-select-option>
+      <ion-select-option [value]="it" *ngFor="let it of monthList">{{it}}月
+      </ion-select-option>
+    </ion-select>
+  </ion-item>
+</ion-header>
+<ion-content>
+  <ion-list>
+    <ion-item-sliding *ngFor="let item of dataList">
+      <ion-item detail class="border-item" [routerLink]="['./detail']" [queryParams]="{id: item.detailid}">
+        <ion-label class="item-username">
+          <h2>
+            <div>{{item.userName}}</div>
+            <span class="dues-month">{{item.year}}-{{item.month}}</span></h2>
+          <p>{{item.dzzmc}}</p>
+        </ion-label>
+        <div slot="end" class="dues-money">
+          <span>{{item.money}}元</span>
+        </div>
+      </ion-item>
+
+      <ion-item-options side="end">
+        <ion-item-option (click)="delete(item.detailid)">删除</ion-item-option>
+      </ion-item-options>
+    </ion-item-sliding>
+  </ion-list>
+  <app-empty *ngIf="dataList.length===0"></app-empty>
+  <ion-infinite-scroll threshold="100px" (ionInfinite)="scroll($event)">
+    <ion-infinite-scroll-content
+      loadingSpinner="bubbles"
+      loadingText="{{total>searchParams.pageIndex*searchParams.pageSize?'正在加载...':'暂无更多'}}">
+    </ion-infinite-scroll-content>
+  </ion-infinite-scroll>
+  <ion-fab vertical="bottom" horizontal="center" slot="fixed" class="fab-add">
+    <ion-fab-button>
+      <ion-text class="btn-add" (click)="add()">
+        <img src="assets/icon/btnadd.png" style="width: 30px;height:30px;">
+        <span class="btn-add-text">新增</span>
+      </ion-text>
+    </ion-fab-button>
+  </ion-fab>
+</ion-content>
+
+

+ 47 - 0
parth5/parth5/src/app/views/pages/partyuser/party-dues/party-dues.component.scss

@@ -0,0 +1,47 @@
+ion-label {
+  margin: 3px !important;
+  padding: 0px;
+}
+.dues-month{
+  color: #998989;
+  font-size: 12px;
+  border-radius: 4px;
+  background-color: #F3F3F3;
+  padding: 0px 4px;
+  margin-left: 20px;
+}
+
+.dues-money{
+  color: #DE4F3F;
+}
+
+
+
+ion-select {
+  color: #5E4545;
+
+  --placeholder-color: #5E4545;
+
+  --placeholder-opacity: 1;
+}
+ion-select::part(icon) {
+  color: #5E4545;
+  opacity: 1;
+}
+ion-header {
+  ion-item {
+    --inner-border-width:  0px;
+    --border-width:0px;
+  }
+}
+
+.item-username{
+  h2{
+    display: -webkit-box;
+    div{
+      width: 60px;
+    }
+  }
+}
+
+

+ 139 - 0
parth5/parth5/src/app/views/pages/partyuser/party-dues/party-dues.component.ts

@@ -0,0 +1,139 @@
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {AlertController, IonInfiniteScroll, LoadingController, ModalController, NavController} from "@ionic/angular";
+import {ActivatedRoute, Router} from "@angular/router";
+import {ConfigService, RequsetData} from "../../../../service/config.service";
+import {UserService} from "../../../../service/user.service";
+import {PartyDuesApi, reqParams} from "../../../../api/partyuser/partydues";
+import {DictionaryApi} from "../../../../api/system/dictionary";
+import {AlertModal} from "../../../../comm/modal/alert";
+import {Observable, of} from "rxjs";
+
+@Component({
+  selector: 'app-party-dues',
+  templateUrl: './party-dues.component.html',
+  styleUrls: ['./party-dues.component.scss'],
+})
+export class PartyDuesComponent implements OnInit {
+
+  @ViewChild(IonInfiniteScroll, {static: true}) infiniteScroll: IonInfiniteScroll;
+
+  userInfo: any = {};
+  dataList: any[] = [];
+  searchParams: reqParams = {
+    pageIndex: 1,
+    pageSize: 20,
+    ssdzzdm: '',
+    xm: '',
+    year: null,
+    month: null
+  };
+  total: number = 20;
+  monthList: any[] = [];
+  yearList: any[] = [];
+
+  constructor(private router: Router, private routeInfo: ActivatedRoute, private configService: ConfigService, private userService: UserService, public modalController: ModalController, private navCtrl: NavController,
+              private partyDuesApi: PartyDuesApi, private dictionaryApi: DictionaryApi
+    , private alertModal: AlertModal) {
+  }
+
+  ngOnInit() {
+    this.routeInfo.queryParams.subscribe(params => {
+      this.searchParams.ssdzzdm = this.searchParams.ssdzzdm || this.userService.GetUser().dataDzzdm;
+      this.searchParams.month = new Date().getMonth() + 1;
+      this.searchParams.year = new Date().getFullYear();
+
+      this.getYearList();
+
+      this.getMonthList();
+
+      this.reload();
+    });
+  }
+
+  getList() {
+    this.partyDuesApi.getList(this.searchParams).subscribe((data: RequsetData) => {
+      if (data.success) {
+        this.dataList = this.dataList.concat(data.item.list);
+        this.total = data.item.total;
+      }
+    });
+  }
+
+  getMonthList() {
+    for (let i = 1; i <= 12; i++) {
+      this.monthList.push(i);
+    }
+  }
+
+  getYearList() {
+    this.dictionaryApi.getDictionaryList('years').subscribe((data: RequsetData) => {
+      if (data.success) {
+        this.yearList = data.item;
+      }
+    });
+  }
+
+  fetchYearLabel() {
+    if (this.searchParams.year && this.yearList.length > 0)
+      return this.yearList.filter(e => e.dickey === this.searchParams.year)[0]?.dicvalue;
+  }
+
+  fetchMonthLabel() {
+    if (this.searchParams.month && this.monthList.length > 0)
+      return this.monthList.filter(e => e === this.searchParams.month)[0];
+  }
+
+  reload() {
+    this.dataList = [];
+    this.searchParams.pageIndex = 1;
+    this.total = 20;
+    this.getList();
+  }
+
+  scroll(event) {
+    setTimeout(() => {
+      event.target.complete();
+      if (this.total > this.searchParams.pageIndex * this.searchParams.pageSize) {
+        this.searchParams.pageIndex += 1;
+        this.getList();
+      }
+    }, 500);
+  }
+
+  yearChange(e) {
+    this.reload();
+  }
+
+  monthChange(e) {
+    this.reload();
+  }
+
+  searchChange(event) {
+    this.searchParams.xm = event.detail.value;
+    this.reload();
+  }
+
+  add() {
+    this.router.navigate(['./edit'], {relativeTo: this.routeInfo, queryParams: {random: Math.random()}});
+  }
+
+  delete(id) {
+    const handler = () => {
+      this.alertModal.loading("正在删除...").then((loading) => {
+        this.partyDuesApi.deleteDetail(id).subscribe((fdata: RequsetData) => {
+          loading.dismiss();
+
+          if (fdata.success) {
+            this.reload();
+          }
+          this.alertModal.alert(fdata.msg);
+        }, () => {
+          loading.dismiss();
+        });
+      });
+    };
+
+    this.alertModal.confirm("确认删除?", handler);
+  }
+
+}

+ 51 - 0
parth5/parth5/src/app/views/pages/partyuser/party-dues/selectuser/selectuser.component.html

@@ -0,0 +1,51 @@
+<ion-header>
+  <ion-toolbar color="danger">
+    <ion-title>
+      人员选择
+    </ion-title>
+    <!--<ion-buttons slot="end">
+      <ion-button (click)="dismiss()">
+        取消
+      </ion-button>
+      <ion-button (click)="select()">
+        选择
+      </ion-button>
+    </ion-buttons>-->
+  </ion-toolbar>
+</ion-header>
+<ion-searchbar #searchBox showCancelButton="never" placeholder="输入姓名查询" id="search-box"
+               (input)="search(searchBox.value)"  (ionClear)="search('')" mode="ios"></ion-searchbar>
+<ion-content>
+  <ion-list class="user-list">
+    <ion-radio-group value="biff">
+      <ion-item *ngFor="let us of userList;" (click)="us.checked=!us.checked">
+        <ion-col size="1" *ngIf="!isSingle">
+          <ion-checkbox color="danger" [(ngModel)]="us.checked" (click)="us.checked=!us.checked"></ion-checkbox>
+        </ion-col>
+        <ion-col size="1" *ngIf="isSingle">
+          <ion-radio color="danger" (click)="check(us)"></ion-radio>
+        </ion-col>
+        <ion-col size="3">
+          <ion-text>{{us.USERNAME}}</ion-text>
+        </ion-col>
+        <ion-col>
+          <ion-text>{{us.DZZMC}}</ion-text>
+        </ion-col>
+      </ion-item>
+      <ion-item *ngIf="userList.length==0" style="text-align: center;">
+        <ion-label><p>暂无数据</p></ion-label>
+      </ion-item>
+    </ion-radio-group>
+  </ion-list>
+  <ion-infinite-scroll threshold="100px" (ionInfinite)="scrollData($event)">
+    <ion-infinite-scroll-content
+      loadingSpinner="bubbles"
+      loadingText="{{loadingText}}">
+    </ion-infinite-scroll-content>
+  </ion-infinite-scroll>
+</ion-content>
+<ion-toolbar class="toolbar-center" style="margin-bottom: 40px;">
+  <ion-button color="light" (click)="dismiss()" mode="ios" style="margin-right: 15px;width: 100px;">关闭</ion-button>
+  <ion-button color="danger" (click)="select()" mode="ios" style="margin-left: 15px;width: 100px;">选择</ion-button>
+</ion-toolbar>
+

+ 0 - 0
parth5/parth5/src/app/views/pages/partyuser/party-dues/selectuser/selectuser.component.scss


+ 103 - 0
parth5/parth5/src/app/views/pages/partyuser/party-dues/selectuser/selectuser.component.ts

@@ -0,0 +1,103 @@
+import {Component, Input, OnInit, ViewChild} from '@angular/core';
+import {IonInfiniteScroll, ModalController, NavParams} from "@ionic/angular";
+import {ConfigService, RequsetData} from "../../../../../service/config.service";
+import {Observable, Subject} from "rxjs";
+import {debounceTime, distinctUntilChanged, switchMap} from "rxjs/operators";
+
+@Component({
+  selector: 'app-selectuser',
+  templateUrl: './selectuser.component.html',
+  styleUrls: ['./selectuser.component.scss'],
+})
+export class SelectuserComponent implements OnInit {
+  @ViewChild(IonInfiniteScroll, {static: true}) infiniteScroll: IonInfiniteScroll;
+  private searchTerms = new Subject<string>();
+  getUserUrl: string = '';
+  isSingle: false;
+  selectparam: any = {
+    pageIndex: 1,
+    pageSize: 10,
+    year: '',
+    month: '',
+    dzzdm: '',
+    removeUserIdList: '',
+    xm: ''
+  };
+  userList: any = [];
+  total: 0;
+  selectusers: any = [];
+  loadingText: string = '正在加载...';
+
+  constructor(navParams: NavParams, private configService: ConfigService, public modalController: ModalController) {
+    this.selectparam.pageIndex = navParams.get('pageIndex');
+    this.selectparam.pageSize = navParams.get('pageSize');
+    this.selectparam.year = navParams.get('year');
+    this.selectparam.month = navParams.get('month');
+    this.selectparam.dzzdm = navParams.get('dzzdm');
+    this.selectparam.removeUserIdList = navParams.get('removeUserIdList');
+    this.getUserUrl = navParams.get('getUserUrl') || this.getUserUrl;
+    this.loadUserList();
+  }
+
+  ngOnInit() {
+  }
+
+  loadUserList(): void {
+    this.configService.HttpGetRomote(this.getUserUrl, this.selectparam).subscribe((data: RequsetData) => {
+      if (data.success) {
+        if (data.item != null) {
+          this.userList = this.userList.concat(data.item.list);
+          this.total = data.item.total;
+        }
+      }
+    });
+  }
+
+  //关键字查询
+  search(term: string): void {
+    this.userList = [];
+    this.selectparam.xm = term;
+    this.loadUserList();
+  }
+
+  //下拉刷新
+  scrollData(event) {
+    setTimeout(() => {
+      event.target.complete();
+      if (this.userList.length < this.total) {
+        this.selectparam.pageIndex = this.selectparam.pageIndex + 1;
+        this.loadUserList();
+      } else {
+        this.loadingText = '暂无更多';
+      }
+    }, 200);
+  }
+
+  //关闭modal
+  dismiss() {
+    this.modalController.dismiss({
+      'dismissed': true
+    });
+  }
+
+  //选择(返回值:ryjbxxbs 人员基本信息标识,rybm 人员编码,xm 姓名,szdzbdm 所在党支部代码,szdzzmc 所在党支部名称)
+  select() {
+    this.selectusers = this.userList.filter(it => {
+      return it.checked == true
+    }).map(function (it) {
+      return it
+    });
+    this.modalController.dismiss({
+      'dismissed': true,
+      'rtnData': this.selectusers
+    });
+  }
+
+  check(us) {
+    this.userList.map(x => {
+      x.checked = false;
+    });
+    us.checked = true;
+  }
+}
+

parth5/parth5/src/app/views/pages/party/party-user/detail/democracy/democracy.component.html → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/democracy/democracy.component.html


parth5/parth5/src/app/views/pages/party/party-user/detail/democracy/democracy.component.scss → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/democracy/democracy.component.scss


parth5/parth5/src/app/views/pages/party/party-user/detail/democracy/democracy.component.ts → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/democracy/democracy.component.ts


parth5/parth5/src/app/views/pages/party/party-user/detail/detail.component.html → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/detail.component.html


parth5/parth5/src/app/views/pages/party/party-user/detail/detail.component.scss → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/detail.component.scss


parth5/parth5/src/app/views/pages/party/party-user/detail/detail.component.ts → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/detail.component.ts


parth5/parth5/src/app/views/pages/party/party-user/detail/partyhelp/partyhelp.component.html → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/partyhelp/partyhelp.component.html


parth5/parth5/src/app/views/pages/party/party-user/detail/partyhelp/partyhelp.component.scss → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/partyhelp/partyhelp.component.scss


parth5/parth5/src/app/views/pages/party/party-user/detail/partyhelp/partyhelp.component.ts → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/partyhelp/partyhelp.component.ts


parth5/parth5/src/app/views/pages/party/party-user/detail/punish/punish.component.html → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/punish/punish.component.html


parth5/parth5/src/app/views/pages/party/party-user/detail/punish/punish.component.scss → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/punish/punish.component.scss


parth5/parth5/src/app/views/pages/party/party-user/detail/punish/punish.component.ts → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/punish/punish.component.ts


parth5/parth5/src/app/views/pages/party/party-user/detail/reward/reward.component.html → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/reward/reward.component.html


parth5/parth5/src/app/views/pages/party/party-user/detail/reward/reward.component.scss → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/reward/reward.component.scss


parth5/parth5/src/app/views/pages/party/party-user/detail/reward/reward.component.ts → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/reward/reward.component.ts


parth5/parth5/src/app/views/pages/party/party-user/detail/train/train.component.html → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/train/train.component.html


parth5/parth5/src/app/views/pages/party/party-user/detail/train/train.component.scss → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/train/train.component.scss


parth5/parth5/src/app/views/pages/party/party-user/detail/train/train.component.ts → parth5/parth5/src/app/views/pages/partyuser/party-user/detail/train/train.component.ts


parth5/parth5/src/app/views/pages/party/party-user/party-user.component.html → parth5/parth5/src/app/views/pages/partyuser/party-user/party-user.component.html


+ 0 - 0
parth5/parth5/src/app/views/pages/partyuser/party-user/party-user.component.scss


parth5/parth5/src/app/views/pages/party/party-user/party-user.component.ts → parth5/parth5/src/app/views/pages/partyuser/party-user/party-user.component.ts


+ 3 - 1
parth5/parth5/src/app/views/tapp/tab-main/tab-main.module.ts

@@ -14,6 +14,7 @@ import {ImglistComponent} from "../../../comm/modal/imglist/imglist.component";
 import {PhotoshowComponent} from "../../../comm/modal/photoshow/photoshow.component";
 import {PhotoSwipeComponent} from "../../../comm/modal/photo-swipe/photo-swipe.component";
 import {MyfilterPipe} from "../../../comm/pipes/myfilter.pipe";
+import {SelectuserComponent} from "../../pages/partyuser/party-dues/selectuser/selectuser.component";
 
 const pubComponents = [
   PartysearchComponent,
@@ -24,7 +25,8 @@ const pubComponents = [
   ImglistComponent,
   PhotoshowComponent,
   PhotoSwipeComponent,
-  MyfilterPipe
+  MyfilterPipe,
+  SelectuserComponent
 ];
 
 /*function getRoutesComponent(routes: Routes) {

+ 3 - 1
parth5/parth5/src/app/views/tapp/tab-main/tab-main.route.ts

@@ -3,6 +3,7 @@ import {TabMainPage} from "./tab-main.page";
 import partyInfoRoutes from "../../../routes/partyInfo";
 import partyUserRoutes from "../../../routes/partyUser";
 import shykRoutes from "../../../routes/shyk";
+import partyDuesRoutes from "../../../routes/partyDues";
 
 export const routes: Routes = [
   {
@@ -11,5 +12,6 @@ export const routes: Routes = [
   },
   ...partyInfoRoutes,
   ...partyUserRoutes,
-  ...shykRoutes
+  ...shykRoutes,
+  ...partyDuesRoutes
 ];

+ 9 - 7
src/main/java/com/ghsc/partybuild/controller/app/AppPartyController.java

@@ -77,14 +77,14 @@ public class AppPartyController {
                                                                            @RequestParam(required = false) List<String> removeRybmList, @RequestParam(required = false) List<String> ryztList,
                                                                            @RequestParam(required = false) Integer age_begin, @RequestParam(required = false) Integer age_end, @RequestParam(required = false) Integer sfsldry,
                                                                            @RequestParam(required = false) String xb, @RequestParam(required = false) String xl, @RequestParam(required = false) String partyGroupId,
-                                                                           @RequestParam(required = false) String sqrdrq_begin, @RequestParam(required = false) String sqrdrq_end,@RequestParam(required = false) Integer isStudent) {
+                                                                           @RequestParam(required = false) String sqrdrq_begin, @RequestParam(required = false) String sqrdrq_end, @RequestParam(required = false) Integer isStudent) {
 
         sqrdrq_begin = dateUtils.strFormat_short(sqrdrq_begin);
         sqrdrq_end = dateUtils.strFormat_short(sqrdrq_end);
 
         RequsetData<PageInfo<HashMap<String, Object>>> res = new RequsetData<>();
         res.setItem(partyUserService.getPartyUserList(pageIndex, pageSize, xb, dzzdm, null, xm, null, null, sqrdrq_begin, sqrdrq_end, null, null,
-                null, ryztList, null, szdzbdm, removeRybmList, rybmList, null, null, null, xl, age_begin, age_end, sfsldry, null, null, null, userId, partyGroupId, null,isStudent,null));
+                null, ryztList, null, szdzbdm, removeRybmList, rybmList, null, null, null, xl, age_begin, age_end, sfsldry, null, null, null, userId, partyGroupId, null, isStudent, null));
 
         return res;
     }
@@ -264,6 +264,7 @@ public class AppPartyController {
 
     /**
      * 获取并初始化党员缴费基数(学生党员默认为0.2,一般不会去设置,需系统自动初始化,逻辑为:用户登录时进行检测,若未配置,则由系统初始化)
+     *
      * @param usercode
      * @param year
      * @return
@@ -429,13 +430,14 @@ public class AppPartyController {
         return res;
     }
 
-    @ResponseBody
-    @GetMapping("/deleteDuesById")
-    public RequsetData<Integer> deleteDuesById(@RequestParam("id") String id) {
-
+    @PostMapping("/deleteDuesById")
+    public RequsetData<Integer> deleteDuesById(@RequestBody Map<String, Object> reqMap) {
         RequsetData<Integer> result = new RequsetData<>();
 
-        int row = publicityService.deleteDuesById(id);
+        String id = reqMap.get("id").toString();
+        String userId = reqMap.get("userId").toString();
+
+        int row = publicityService.deleteDuesById(id, userId);
         result.setItem(row);
         if (row == 0) {
             result.setSuccess(false);

+ 1 - 1
src/main/java/com/ghsc/partybuild/service/PublicityService.java

@@ -410,7 +410,7 @@ public interface PublicityService {
 
     int savePartyduesDetail(UsPartyduesDetail model,String userId,String userName);
 
-    int deleteDuesById(String id);
+    int deleteDuesById(String id,String userId);
 
     PageInfo<HashMap<String, Object>> getSettingDuesUserList(int page, int rows,Integer year, String dzzdm
             ,String rybm,String xm,String szdzb,Integer isStudent);

+ 8 - 2
src/main/java/com/ghsc/partybuild/service/impl/PublicityServiceImpl.java

@@ -1258,8 +1258,14 @@ public class PublicityServiceImpl implements PublicityService {
     }
 
     @Override
-    public int deleteDuesById(String id) {
-        return 0;/*usPartyduesDetailMapper.deleteByPrimaryKey(id);*/
+    public int deleteDuesById(String id,String userId) {
+        UsPartyduesDetail detail = usPartyduesDetailMapper.selectByPrimaryKey(id);
+        detail.setMoney(null);
+        detail.setPaystate(0);
+        detail.setUpdatetime(new Date());
+        detail.setUpdateuserid(userId);
+
+        return usPartyduesDetailMapper.updateByPrimaryKey(detail);
     }
 
     /**

+ 9 - 6
src/main/resources/mapping/PublicityCQuery.xml

@@ -626,15 +626,18 @@
     </select>
 
     <select id="selectUserDuesList" resultType="java.util.HashMap">
-        select us.partyduesId,u.xm,u.rybm,z.dzzdm,z.dzzmc,us.year,d.month,us.MONEY as baseMoney,(ifnull(d.MONEY,0)+ifnull(d.SPECIALEXPENSES,0)) as money,
+        select us.partyduesId,u.xm as userName,u.rybm as userCode
+        ,z.dzzdm as partyCode,z.dzzmc as partyName
+        ,us.year,d.month,us.MONEY as baseMoney,(ifnull(d.MONEY,0)+ifnull(d.SPECIALEXPENSES,0)) as money,
         d.detailid
         from US_PARTYDUES us
         inner join US_PARTYDUES_DETAIL d on us.PARTYDUESID = d.PARTYDUESID
-        inner join VM_RYJBXX u on us.USERCODE = u.RYBM
-        inner join ZZ_ZZQKXX z on u.SZDZBDM = z.DZZDM
-        where 1=1 and d.OPERATESTATE <![CDATA[ <> ]]> 'D'
+        inner join VM_RYJBXX_ALL u on us.USERCODE = u.RYBM
+        inner join us_party_month upm on us.userCode= upm.userCode and upm.yearMonth = (us.YEAR*100+d.month)
+        inner join ZZ_ZZQKXX z on upm.partycode = z.DZZDM
+        where 1=1 and d.payState=1
         <if test="ssdzzdm!=null and ssdzzdm !=''">
-            and u.SZDZBDM like concat( '%',#{ssdzzdm},'%')
+            and z.DZZDM like concat( '',#{ssdzzdm},'%')
         </if>
         <if test="xm!=null and xm !=''">
             and u.XM like concat('%',#{xm},'%')
@@ -645,7 +648,7 @@
         <if test="month!=null">
             and d.MONTH = #{month}
         </if>
-        order by us.YEAR desc,d.MONTH desc,u.XMPY,u.RYJBXXBS
+        order by us.YEAR desc,d.MONTH desc,CONVERT(u.XM USING gbk)
     </select>
 
     <!--党员基本信息-->