Browse Source

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	lib/数据更新脚本.txt
#	parth5/parth5/src/app/views/tapp/tabs/tabs.module.ts
xiaoqiao 7 months ago
parent
commit
49b446edd9
56 changed files with 1754 additions and 308 deletions
  1. 4 0
      lib/数据更新脚本.txt
  2. 28 0
      parth5/parth5/src/app/api/account/index.ts
  3. 3 2
      parth5/parth5/src/app/api/file/index.ts
  4. 36 0
      parth5/parth5/src/app/api/propagandawork/dzzfc/index.ts
  5. 23 0
      parth5/parth5/src/app/api/wechat/index.ts
  6. 2 1
      parth5/parth5/src/app/app-routing.module.ts
  7. 2 11
      parth5/parth5/src/app/app.component.ts
  8. 4 2
      parth5/parth5/src/app/comm/modal/bimage/bimage.component.ts
  9. 1 1
      parth5/parth5/src/app/comm/modal/imglist/imglist.component.ts
  10. 18 0
      parth5/parth5/src/app/routes/propagandawork/dzzfc.ts
  11. 57 0
      parth5/parth5/src/app/service/account.service.ts
  12. 9 0
      parth5/parth5/src/app/service/user.service.ts
  13. 75 0
      parth5/parth5/src/app/service/wxcp.service.ts
  14. 73 0
      parth5/parth5/src/app/utils/urlUtils.ts
  15. 17 0
      parth5/parth5/src/app/views/index/index-routing.module.ts
  16. 20 0
      parth5/parth5/src/app/views/index/index.module.ts
  17. 3 0
      parth5/parth5/src/app/views/index/index.page.html
  18. 0 0
      parth5/parth5/src/app/views/index/index.page.scss
  19. 47 0
      parth5/parth5/src/app/views/index/index.page.ts
  20. 6 0
      parth5/parth5/src/app/views/login/login.page.html
  21. 13 1
      parth5/parth5/src/app/views/login/login.page.ts
  22. 49 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/detail/detail.component.html
  23. 38 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/detail/detail.component.scss
  24. 107 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/detail/detail.component.ts
  25. 71 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/edit/edit.component.html
  26. 31 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/edit/edit.component.scss
  27. 138 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/edit/edit.component.ts
  28. 53 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/list.component.html
  29. 42 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/list.component.scss
  30. 146 0
      parth5/parth5/src/app/views/pages/propagandawork/dzzfc/list.component.ts
  31. 2 0
      parth5/parth5/src/app/views/tapp/tab-main/tab-main.route.ts
  32. 8 1
      parth5/parth5/src/app/views/tapp/tabs/tabs.module.ts
  33. 53 1
      src/main/java/com/ghsc/partybuild/controller/SHYKController.java
  34. 103 0
      src/main/java/com/ghsc/partybuild/controller/app/AppDzzfcController.java
  35. 2 2
      src/main/java/com/ghsc/partybuild/controller/app/AppFileController.java
  36. 91 57
      src/main/java/com/ghsc/partybuild/controller/app/AppHomeController.java
  37. 0 2
      src/main/java/com/ghsc/partybuild/mapper/PartyCQuery.java
  38. 2 0
      src/main/java/com/ghsc/partybuild/mapper/SHYKCQuery.java
  39. 10 0
      src/main/java/com/ghsc/partybuild/model/CfUsers.java
  40. 70 0
      src/main/java/com/ghsc/partybuild/model/CfUsersExample.java
  41. 17 2
      src/main/java/com/ghsc/partybuild/service/FileService.java
  42. 1 0
      src/main/java/com/ghsc/partybuild/service/SHYKService.java
  43. 4 0
      src/main/java/com/ghsc/partybuild/service/UserService.java
  44. 48 4
      src/main/java/com/ghsc/partybuild/service/impl/FileServiceImpl.java
  45. 3 3
      src/main/java/com/ghsc/partybuild/service/impl/PartyUserServiceImpl.java
  46. 5 0
      src/main/java/com/ghsc/partybuild/service/impl/SHYKServiceImpl.java
  47. 15 0
      src/main/java/com/ghsc/partybuild/service/impl/UserServiceImpl.java
  48. 2 1
      src/main/resources/application.yml
  49. 40 25
      src/main/resources/mapping/CfUsersMapper.xml
  50. 2 2
      src/main/resources/mapping/IntegratedQueryCQuery.xml
  51. 1 1
      src/main/resources/mapping/PartyCQuery.xml
  52. 11 11
      src/main/resources/mapping/PartyUserCQuery.xml
  53. 18 1
      src/main/resources/mapping/SHYKCQuery.xml
  54. 52 56
      src/main/resources/static/app/main/partyTwoExt/ztdrxx/summary.html
  55. 69 112
      src/main/resources/static/app/main/partyTwoExt/ztdrxx/summary.js
  56. 9 9
      src/main/resources/static/app/main/report/partydetail/list.html

+ 4 - 0
lib/数据更新脚本.txt

@@ -194,3 +194,7 @@ INSERT INTO CF_DICTIONARY (DICTIONARYID, DICKEY, DICVALUE, DICTYPEKEY, DICTYPE,
 INSERT INTO CF_DICTIONARY (DICTIONARYID, DICKEY, DICVALUE, DICTYPEKEY, DICTYPE, APPLICATIONID, DICNOTE, OPERATETIME, OPERATESTATE, SYNCSTATE) VALUES ('855867d0-8888-4710-90fd-222e6bb77993', 3, '已交卷', 'testmanRecordStauts', 1, 'f0c4fa7f9f3c4fb6bd56aac608b7ad3f', null, TIMESTAMP '2022-04-20 16:51:33', 'A', 'N');
 INSERT INTO CF_DICTIONARY (DICTIONARYID, DICKEY, DICVALUE, DICTYPEKEY, DICTYPE, APPLICATIONID, DICNOTE, OPERATETIME, OPERATESTATE, SYNCSTATE) VALUES ('855867d0-9999-4710-90fd-333e6bb77993', 4, '缺考', 'testmanRecordStauts', 1, 'f0c4fa7f9f3c4fb6bd56aac608b7ad3f', null, TIMESTAMP '2022-04-20 16:51:33', 'A', 'N');
 INSERT INTO CF_DICTIONARY (DICTIONARYID, DICKEY, DICVALUE, DICTYPEKEY, DICTYPE, APPLICATIONID, DICNOTE, OPERATETIME, OPERATESTATE, SYNCSTATE) VALUES ('855867d0-0000-4710-90fd-333e6bb77993', 5, '已公布成绩', 'testmanRecordStauts', 1, 'f0c4fa7f9f3c4fb6bd56aac608b7ad3f', null, TIMESTAMP '2022-04-20 16:51:33', 'A', 'N');
+
+-- 2024.7.19
+alter table cf_users add wxUserId varchar(50);
+

+ 28 - 0
parth5/parth5/src/app/api/account/index.ts

@@ -0,0 +1,28 @@
+import {ConfigService, RequsetData} from "../../service/config.service";
+import {Injectable} from "@angular/core";
+import {Observable} from "rxjs";
+import {DESModel, DesService} from "../../service/des.service";
+
+@Injectable({providedIn: 'root'})
+export class AccountApi {
+  constructor(private configService: ConfigService, private desService: DesService) {
+  }
+
+  login(model: DESModel): Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/appApi/home/login', model);
+  }
+
+  loginByWxUserId(wxUserId: string): Observable<RequsetData> {
+    let desModel = this.desService.GetToken(wxUserId);
+    return this.configService.HttpPostRomote('/appApi/home/loginByWxUserId', desModel);
+  }
+
+  bindWxUserId(userId: string, wxUserId: string): Observable<RequsetData> {
+    return this.configService.HttpPostRomote('/appApi/home/bindWxUserId', {
+      userId: userId,
+      wxUserId: wxUserId
+    });
+  }
+
+}
+

+ 3 - 2
parth5/parth5/src/app/api/file/index.ts

@@ -36,9 +36,10 @@ export class FileApi {
     });
   }
 
-  getImageBase64(fileId: string) {
+  getImageBase64(id: string, type: string) {
     return this.configService.HttpGetRomote('/appApi/file/getImageBase64', {
-      fileId: fileId
+      id: id,
+      type : type
     });
   }
 

+ 36 - 0
parth5/parth5/src/app/api/propagandawork/dzzfc/index.ts

@@ -0,0 +1,36 @@
+import {ConfigService, RequsetData} from "../../../service/config.service";
+import {Injectable} from "@angular/core";
+import {Observable} from "rxjs";
+import {UserService} from "../../../service/user.service";
+
+export interface reqParams {
+  pageindex: number,
+  pagesize: number,
+  dzzdm: string,
+  ztmc: string,
+  fcType: number
+}
+
+@Injectable({providedIn: 'root'})
+export class DzzfcApi {
+  constructor(private configService: ConfigService, private userService: UserService) {
+  }
+
+  getList(params: reqParams): Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/appApi/publicity/dzzfc/getList', params);
+  }
+
+  delete(id: string): Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/appApi/publicity/dzzfc/delete', {id: id });
+  }
+
+  getData(id: string) {
+    return this.configService.HttpGetRomote('/appApi/publicity/dzzfc/get', {id: id});
+  }
+
+  save(data: any): Observable<RequsetData> {
+    return this.configService.HttpPostRomote('/appApi/publicity/dzzfc/save', data);
+  }
+
+}
+

+ 23 - 0
parth5/parth5/src/app/api/wechat/index.ts

@@ -0,0 +1,23 @@
+import {ConfigService, RequsetData} from "../../service/config.service";
+import {Injectable} from "@angular/core";
+import {Observable} from "rxjs";
+
+@Injectable({providedIn: 'root'})
+export class WechatApi {
+  constructor(private configService: ConfigService) {
+  }
+
+  getOAuthUrl(redirectUrl:string):Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/wxapi/cp/getOAuthUrl', {
+      redirectUrl
+    });
+  }
+
+  getWxCpUserId(code:string):Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/wxapi/cp/getWxCpUserId', {
+      code
+    });
+  }
+
+}
+

+ 2 - 1
parth5/parth5/src/app/app-routing.module.ts

@@ -3,7 +3,8 @@ import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
 
 const routes: Routes = [
   { path: 'tapp', loadChildren: () => import('./views/tapp/tabs/tabs.module').then(m => m.TabsPageModule)},
-  { path: '', loadChildren: () => import('./views/login/login.module').then(m => m.LoginPageModule) },
+  { path: 'login', loadChildren: () => import('./views/login/login.module').then(m => m.LoginPageModule) },
+  { path: '', loadChildren: () => import('./views/index/index.module').then(m => m.IndexPageModule) },
   {
     path: '**',
     redirectTo: ''

+ 2 - 11
parth5/parth5/src/app/app.component.ts

@@ -1,13 +1,4 @@
 import {Component} from '@angular/core';
-import {ActivatedRoute, Router} from "@angular/router";
-import {ConfigService} from "./service/config.service";
-import {UserService} from "./service/user.service";
-import {JsBridgeService} from "./service/js-bridge.service";
-import {DesService} from "./service/des.service";
-import {LoadingController} from "@ionic/angular";
-import {UsemodularService} from "./service/usemodular.service";
-import {WxpayService} from "./service/wxpay.service";
-
 
 @Component({
   selector: 'app-root',
@@ -15,10 +6,10 @@ import {WxpayService} from "./service/wxpay.service";
   styleUrls: ['app.component.scss'],
 })
 export class AppComponent {
-  constructor(private router: Router, private route: ActivatedRoute, private userService: UserService, private wxpayService: WxpayService) {
+  constructor() {
   }
 
   ngOnInit() {
-    this.wxpayService.getWechatCode();
+
   }
 }

+ 4 - 2
parth5/parth5/src/app/comm/modal/bimage/bimage.component.ts

@@ -15,9 +15,11 @@ export class BimageComponent implements OnInit {
   photoSwipe: PhotoSwipeComponent;
 
   @Input() fileid: string = '';
+  @Input() type: string = '';
 
   imgModel: any = {
-    fileid: ''
+    fileid: '',
+    type: '1',
   };
 
   constructor(private fileApi: FileApi, private sanitizer: DomSanitizer, private alertModal: AlertModal) {
@@ -28,7 +30,7 @@ export class BimageComponent implements OnInit {
   }
 
   getImgBase64() {
-    this.fileApi.getImageBase64(this.fileid).subscribe((data: RequsetData) => {
+    this.fileApi.getImageBase64(this.fileid, this.type).subscribe((data: RequsetData) => {
       if (data.success && data.item != null) {
         this.imgModel.base64 = "data:image/png;base64," + data.item.base64;
         this.imgModel.height = data.item.height;

+ 1 - 1
parth5/parth5/src/app/comm/modal/imglist/imglist.component.ts

@@ -61,7 +61,7 @@ export class ImglistComponent implements OnInit {
 
   getImgBase64() {
     this.imgList.filter(e => !e.base64).forEach(img => {
-      this.fileApi.getImageBase64(img.fileid).subscribe((data: RequsetData) => {
+      this.fileApi.getImageBase64(img.fileid, "1").subscribe((data: RequsetData) => {
         if (data.success && data.item != null) {
           img.base64 = "data:image/png;base64," + data.item.base64;
           img.height = data.item.height;

+ 18 - 0
parth5/parth5/src/app/routes/propagandawork/dzzfc.ts

@@ -0,0 +1,18 @@
+import {Routes} from "@angular/router";
+import {
+  DzzfcListComponent
+} from "../../views/pages/propagandawork/dzzfc/list.component";
+import {
+  DzzfcEditComponent
+} from "../../views/pages/propagandawork/dzzfc/edit/edit.component";
+import {
+  DzzfcDetailComponent
+} from "../../views/pages/propagandawork/dzzfc/detail/detail.component";
+
+const routes: Routes = [
+  {path: 'propagandawork/dzzfc', component: DzzfcListComponent},
+  {path: 'propagandawork/dzzfc/edit', component: DzzfcEditComponent},
+  {path: 'propagandawork/dzzfc/detail', component: DzzfcDetailComponent},
+];
+
+export default routes;

+ 57 - 0
parth5/parth5/src/app/service/account.service.ts

@@ -0,0 +1,57 @@
+import {Injectable, Inject} from '@angular/core';
+import {DOCUMENT} from '@angular/common';
+import {ConfigService, RequsetData} from "./config.service";
+import {from, Observable} from "rxjs";
+import * as moment from "./work.service";
+import {Router} from "@angular/router";
+import {AlertController} from "@ionic/angular";
+import {AccountApi} from "../api/account";
+import {UsemodularService} from "./usemodular.service";
+import {AlertModal} from "../comm/modal/alert";
+import {UserService} from "./user.service";
+
+
+@Injectable({providedIn: 'root'})
+export class AccountService {
+
+  constructor(private router: Router, private userService: UserService,
+              private configService: ConfigService, private accountApi: AccountApi, private usemodularService: UsemodularService, private alertModal: AlertModal) {
+
+  }
+
+
+  /**
+   * 根据微信用户id登录系统,如果未绑定则跳转到登陆页面
+   * @param wxUserId 企业微信用户id
+   * @param currentUrl 登录成功后跳转路由,可未空,默认首页路由
+   */
+  async loginByWxUserId(wxUserId: string, currentUrl: string) {
+    if (!wxUserId)
+      return false;
+
+    const loading = await this.alertModal.loading('验证微信用户中,请稍等...');
+    await loading.present();
+
+    this.accountApi.loginByWxUserId(wxUserId).subscribe(req => {
+      loading.dismiss();
+      if (req.success) {
+        req.item.curRoleId = req.extdata.userRoles[0].roleid;
+        this.userService.SetUser(req.item);
+        this.userService.SetExt(req.extdata);
+        this.userService.setToken(req.item.logintoken);
+        this.userService.ReadUserDataScope(req.item.curRoleId, this.configService);
+        this.usemodularService.getButtonList();
+        this.router.navigate([currentUrl || '/tapp/tabs/tabMain']);
+      } else {
+        this.alertModal.alert('微信用户未绑定或验证失败,请输入账号密码登录');
+        this.router.navigate(['/login']);
+      }
+    }, () => {
+      loading.dismiss();
+      this.alertModal.alert('微信用户未绑定或验证失败,请输入账号密码登录');
+      this.router.navigate(['/login']);
+    });
+  };
+
+
+}

+ 9 - 0
parth5/parth5/src/app/service/user.service.ts

@@ -16,6 +16,7 @@ export class UserService {
   userDataScope: string = '/appApi/home/UserDataScope';
   tokenName = "logintoken";
   openIDName = "userOpenID";
+  wxUserIdName = "wxUserId";
 
   constructor(@Inject(DOCUMENT) private document: any, private router: Router, private  alertController: AlertController) {
     this.win = this.document.defaultView;
@@ -85,6 +86,14 @@ export class UserService {
     return this.lStorage[this.openIDName];
   }
 
+  setWxUserID(wxUserId: string) {
+    this.lStorage[this.wxUserIdName] = wxUserId;
+  }
+
+  getWxUserID() {
+    return this.lStorage[this.wxUserIdName];
+  }
+
   verifyToken() {
     let token = this.lStorage[this.tokenName];
     let url = location.href.split("#");

+ 75 - 0
parth5/parth5/src/app/service/wxcp.service.ts

@@ -0,0 +1,75 @@
+import {Inject, Injectable} from '@angular/core';
+import {ConfigService, RequsetData} from "./config.service";
+import {UserService} from "./user.service";
+import {from, interval, Observable, of, Subject} from "rxjs";
+import * as moment from 'moment';
+import {DOCUMENT} from "@angular/common";
+import {AlertController, LoadingController} from "@ionic/angular";
+import {ActivatedRoute, Router} from "@angular/router";
+import {AlertModal} from "../comm/modal/alert";
+import {WechatApi} from "../api/wechat";
+import {getUrlParams} from "../utils/urlUtils";
+
+@Injectable({
+  providedIn: 'root'
+})
+
+export class WxcpService {
+  private siteUrl: string = '';
+
+  constructor(@Inject(DOCUMENT) private document: any, private router: Router, private configService: ConfigService, private userService: UserService
+    , private alertModal: AlertModal, private wechatApi: WechatApi, private routeInfo: ActivatedRoute) {
+    this.configService.GetConfig().subscribe((config) => {
+      this.siteUrl = config.siteUrl;
+    });
+  }
+
+  isWechat = () => {
+    return String(navigator.userAgent.toLowerCase().match(/MicroMessenger/i)) === "micromessenger";
+  }
+
+  wxAuth = async <Object>(routePath: string): Promise<string> => {
+    try {
+      const urlParams = getUrlParams() as any;
+      const openId = urlParams["wxUserId"] || this.userService.getWxUserID();
+      const code = urlParams["code"];
+
+      if (this.isWechat()) {
+        if (openId) {
+          this.userService.setWxUserID(openId);
+        } else {
+          if (!code) {
+            const loading = await this.alertModal.loading('微信授权中,请稍等...');
+            await loading.present();
+
+            let oAuthUrl_redirectUrl = this.siteUrl + "?routePath=" + encodeURIComponent(routePath); //www.aa.com/mobile?routePath=xxxxx
+            this.wechatApi.getOAuthUrl(encodeURIComponent(oAuthUrl_redirectUrl)).subscribe((res: any) => {
+              if (res) {
+                window.location.replace(res);
+              } else {
+                this.alertModal.alert("微信授权失败!");
+              }
+            });
+          } else {
+            const loading = await this.alertModal.loading('微信授权成功,请稍等...');
+            await loading.present();
+            await this.wechatApi.getWxCpUserId(code).subscribe((res: any) => {
+              this.userService.setWxUserID(res);
+
+              const currentUrl = routePath + (routePath.indexOf("?") >= 0 ? "&" : "?") + "wxUserId=" + res;
+
+              this.router.navigate([currentUrl], {
+                relativeTo: this.routeInfo,
+                queryParams: {random: Math.random(), op: 0}
+              });
+            });
+          }
+        }
+      }
+
+      return "";
+    } catch (e) {
+      return Promise.reject(null);
+    }
+  }
+}

+ 73 - 0
parth5/parth5/src/app/utils/urlUtils.ts

@@ -0,0 +1,73 @@
+/**
+ * 将对象添加当作参数拼接到URL上面
+ * @param baseUrl 需要拼接的url
+ * @param obj 参数对象
+ * @returns {string} 拼接后的对象
+ * 例子:
+ *  let obj = {a: '3', b: '4'}
+ *  setObjToUrlParams('www.baidu.com', obj)
+ *  ==>www.baidu.com?a=3&b=4
+ */
+export function setObjToUrlParams(baseUrl: string, obj: any): string {
+  let parameters = '';
+  let url = '';
+  for (const key in obj) {
+    parameters += `${key}=${encodeURIComponent(obj[key])}&`;
+  }
+  parameters = parameters.replace(/&$/, '');
+  if (/\?$/.test(baseUrl)) {
+    url = baseUrl + parameters;
+  } else {
+    url = baseUrl.replace(/\/?$/, '?') + parameters;
+  }
+  return url;
+}
+
+/**
+ * 将路径中重复的正斜杆替换成单个斜杆隔开的字符串
+ * @param path 要处理的路径
+ * @returns {string} 将/去重后的结果
+ */
+export const uniqueSlash = (path: string) => path.replace(/(https?:\/)|(\/)+/g, '$1$2');
+// Safari 不支持以下正则(反向否定查找) shit!
+// export const uniqueSlash = (path: string) => path.replace(/(?<!:)\/{2,}/g, '/');
+
+
+export function getUrlParams() {
+  /*let href = decodeURIComponent(location.href);
+  href = decodeURIComponent(href);*/
+  const href = location.href;
+
+  /*alert("href:"+href);*/
+  const theRequest = new Object();
+  let urls = [];
+  if (href.indexOf("#") != -1) {
+    const index = href.indexOf("#");
+    urls = [href.slice(0, index), href.slice(index + 1)];
+  } else {
+    urls = [href];
+  }
+
+  urls.forEach(url => {
+    if (url.indexOf("?") != -1) {
+      const index = url.indexOf("?");
+      const splits = [url.slice(0, index), url.slice(index + 1)];
+      const paramsUrl = splits[1];
+      const strs = paramsUrl.split("&");
+      for (let i = 0; i < strs.length; i++) {
+        // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+        // @ts-ignore
+        const paramsIndex = strs[i].indexOf("=");
+        const paramsSplits = [strs[i].slice(0, paramsIndex), strs[i].slice(paramsIndex + 1)];
+
+        // eslint-disable-next-line @typescript-eslint/ban-ts-comment
+        // @ts-ignore
+        theRequest[paramsSplits[0]] = paramsSplits[1];
+      }
+    }
+  });
+
+  console.log(theRequest);
+
+  return theRequest;
+}

+ 17 - 0
parth5/parth5/src/app/views/index/index-routing.module.ts

@@ -0,0 +1,17 @@
+import { NgModule } from '@angular/core';
+import { Routes, RouterModule } from '@angular/router';
+
+import { IndexPage } from './index.page';
+
+const routes: Routes = [
+  {
+    path: '',
+    component: IndexPage
+  }
+];
+
+@NgModule({
+  imports: [RouterModule.forChild(routes)],
+  exports: [RouterModule],
+})
+export class IndexPageRoutingModule {}

+ 20 - 0
parth5/parth5/src/app/views/index/index.module.ts

@@ -0,0 +1,20 @@
+import { NgModule } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+
+import { IonicModule } from '@ionic/angular';
+
+import { IndexPageRoutingModule } from './index-routing.module';
+
+import { IndexPage } from './index.page';
+
+@NgModule({
+  imports: [
+    CommonModule,
+    FormsModule,
+    IonicModule,
+    IndexPageRoutingModule
+  ],
+  declarations: [IndexPage]
+})
+export class IndexPageModule {}

+ 3 - 0
parth5/parth5/src/app/views/index/index.page.html

@@ -0,0 +1,3 @@
+<ion-content>
+  系统加载中,请稍等...
+</ion-content>

+ 0 - 0
parth5/parth5/src/app/views/index/index.page.scss


+ 47 - 0
parth5/parth5/src/app/views/index/index.page.ts

@@ -0,0 +1,47 @@
+import {Component, OnInit} from '@angular/core';
+import {getUrlParams} from "../../utils/urlUtils";
+import {WxcpService} from "../../service/wxcp.service";
+import {ActivatedRoute, Router} from "@angular/router";
+import {UserService} from "../../service/user.service";
+import {ConfigService} from "../../service/config.service";
+import {AccountApi} from "../../api/account";
+import {UsemodularService} from "../../service/usemodular.service";
+import {AlertModal} from "../../comm/modal/alert";
+import {AccountService} from "../../service/account.service";
+
+@Component({
+  selector: 'app-index',
+  templateUrl: './index.page.html',
+  styleUrls: ['./index.page.scss'],
+})
+export class IndexPage implements OnInit {
+  private routePath = '';
+
+
+  constructor(private router: Router, private route: ActivatedRoute, private wxcpService: WxcpService, private userService: UserService,
+              private accountService: AccountService) {
+  }
+
+  ngOnInit() {
+  }
+
+  ionViewWillEnter() {
+    const urlParams = getUrlParams() as any;
+    this.routePath = urlParams["routePath"] || '/login';
+    this.routePath = decodeURIComponent(this.routePath);
+
+    if (this.wxcpService.isWechat() && this.routePath.indexOf("wxMessage") < 0) {
+      const wxUserId = urlParams["wxUserId"] || this.userService.getWxUserID();
+      if (wxUserId) {
+        //根据微信用户id登录系统
+        this.accountService.loginByWxUserId(wxUserId, null).then(e => {
+        });
+      } else {
+        this.wxcpService.wxAuth(this.routePath);
+      }
+    } else {
+      this.router.navigate([this.routePath], {queryParams: {random: Math.random()}});
+    }
+  }
+
+}

+ 6 - 0
parth5/parth5/src/app/views/login/login.page.html

@@ -14,6 +14,12 @@
     <ion-icon name="lock-closed-outline"></ion-icon>
     <ion-input [(ngModel)]="userPwd" type="password" placeholder="请输入密码"></ion-input>
   </ion-item>
+  <ion-item style="padding-left: 20px;">
+    <ion-checkbox [(ngModel)]="isBindWxUser"></ion-checkbox>
+    <ion-label style="padding-left: 10px;">绑定微信账号
+      <span>{{wxUserId}}</span>
+    </ion-label>
+  </ion-item>
   <div style="text-align: center;padding-top: 30px;">
     <ion-button clickLog logTitle="app.login-click" [logUserid]="userLid" logOpmodule="用户登录" fill="solid"
                 (click)="Login()" style="width: 80%;font-size: 20px;font-weight: bold;--border-radius: 18px;height: 40px;--background:#E80000" >登    录

+ 13 - 1
parth5/parth5/src/app/views/login/login.page.ts

@@ -8,6 +8,8 @@ import {DESModel, DesService} from '../../service/des.service';
 import {LoadingController} from '@ionic/angular';
 import {UsemodularService} from "../../service/usemodular.service";
 import {WxpayService} from "../../service/wxpay.service";
+import {getUrlParams} from "../../utils/urlUtils";
+import {AccountApi} from "../../api/account";
 
 @Component({
   selector: 'app-login',
@@ -22,11 +24,13 @@ export class LoginPage implements OnInit {
   userLid: string = '';
   userPwd: string = '';
   isDev: boolean = false;
+  wxUserId: string = '';
+  isBindWxUser: boolean = false;
 
   constructor(private router: Router, private route: ActivatedRoute,
               private configService: ConfigService, private userService: UserService, private jsBridgeService: JsBridgeService,
               private desService: DesService, private loadingController: LoadingController, private usemodularService: UsemodularService,
-              private wxpayService: WxpayService) {
+              private wxpayService: WxpayService, private accountApi: AccountApi) {
     this.route.queryParams.subscribe(params => {
 
     });
@@ -36,6 +40,11 @@ export class LoginPage implements OnInit {
     });
   }
 
+  ionViewWillEnter() {
+    const urlParams = getUrlParams() as any;
+    this.wxUserId = urlParams["wxUserId"] || this.userService.getWxUserID();
+  }
+
   /*ionViewWillEnter(){
     this.wxpayService.getWechatCode();
   }*/
@@ -64,6 +73,9 @@ export class LoginPage implements OnInit {
         this.userService.ReadUserDataScope(req.item.curRoleId, this.configService);
         this.usemodularService.getButtonList();
         //this.configService.HttpPostRomote()
+        if (this.isBindWxUser) {
+          this.accountApi.bindWxUserId(this.userService.GetUser().userid, this.wxUserId).subscribe(e=>{});
+        }
         this.router.navigate(['/tapp/tabs/tabMain']);
       } else {
         this.errorShow = true;

+ 49 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/detail/detail.component.html

@@ -0,0 +1,49 @@
+<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>
+  <form class="form-table">
+    <ion-item>
+      <ion-label>主题名称</ion-label>
+      <ion-text>{{dataModel.ztmc}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>所属党组织</ion-label>
+      <ion-text>{{dataModel.dzzmc}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>类别</ion-label>
+      <ion-text>{{dataModel.fctypename}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>时间</ion-label>
+      <ion-text>{{dataModel.sj}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>链接</ion-label>
+      <ion-text>{{dataModel.lj}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>简介</ion-label>
+      <ion-text>{{dataModel.jj}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>内容</ion-label>
+      <ion-text>{{dataModel.nr}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>宣传备注</ion-label>
+      <ion-text>{{dataModel.remark}}</ion-text>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>图片</ion-label>
+    </ion-item>
+    <app-imglist [(imgOption)]="imgOption" [(imgList)]="imgList"></app-imglist>
+  </form>
+</ion-content>
+<app-photo-swipe></app-photo-swipe>

+ 38 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/detail/detail.component.scss

@@ -0,0 +1,38 @@
+ion-content{
+  z-index: 11;
+}
+
+ion-item {
+  --inner-border-width: 0px 0px 1px 0px;
+  margin-right: 10px;
+}
+
+.detail-open::part(detail-icon){
+  transform: rotate(90deg);
+  transition: transform 0.2s ease-out;
+}
+
+.detail-close::part(detail-icon){
+  transform: rotate(0deg);
+  transition: transform 0.2s ease-out;
+}
+
+ion-item{
+  img{
+    margin-right: 10px;
+    border-radius: 8px;
+    width: 80px;
+    height: 50px;
+  }
+  .item-img{
+    object-fit: cover;
+  }
+}
+
+.item-detail{
+  margin: 0px !important;
+}
+
+.border-none{
+  --inner-border-width: 0px !important;
+}

+ 107 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/detail/detail.component.ts

@@ -0,0 +1,107 @@
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {DatePipe} from "@angular/common";
+import {ActivatedRoute, Router} from "@angular/router";
+import {AlertController, LoadingController, ModalController} from "@ionic/angular";
+import {PhotoSwipeComponent} from "../../../../../comm/modal/photo-swipe/photo-swipe.component";
+import {ConfigService, RequsetData} from "../../../../../service/config.service";
+import {UserService} from "../../../../../service/user.service";
+import {PositionApi} from "../../../../../api/propagandawork/position";
+import {AlertModal} from "../../../../../comm/modal/alert";
+import {PanelApi} from "../../../../../api/propagandawork/position/panel";
+import {DzzfcApi} from "../../../../../api/propagandawork/dzzfc";
+import {DictionaryApi} from "../../../../../api/system/dictionary";
+import * as moment from "moment";
+
+@Component({
+  selector: 'app-detail',
+  templateUrl: './detail.component.html',
+  styleUrls: ['./detail.component.scss'],
+})
+export class DzzfcDetailComponent implements OnInit {
+
+  @ViewChild(PhotoSwipeComponent)
+  photoSwipe: PhotoSwipeComponent;
+
+  dataModel: any = {};
+  detailOpen: boolean = false;
+  webServerHost: string = '';
+  imgOption: any = {
+    fileRefid: '',
+    fileName: '',
+    fileType: 4,
+    isMulti: true,
+    readonly: true
+  };
+  imgList = [];
+
+  constructor(private datePipe: DatePipe, private router: Router, private routeInfo: ActivatedRoute, private configService: ConfigService, private userService: UserService, public alertController: AlertController,
+              public modalController: ModalController, public loadingController: LoadingController
+    , private dzzfcApi: DzzfcApi, private alertModal: AlertModal, private dictionaryApi: DictionaryApi) {
+
+  }
+
+  ngOnInit() {
+    this.routeInfo.queryParams.subscribe(params => {
+      this.dataModel.id = params['id'];
+      this.imgOption.fileRefid = params['id'];
+      this.getData();
+    });
+
+    this.configService.GetConfig().subscribe((config) => {
+      this.webServerHost = config.webServerHost;
+    });
+  }
+
+  getData() {
+    this.dzzfcApi.getData(this.dataModel.id).subscribe((data: RequsetData) => {
+      if (data.success) {
+        this.dataModel = data.item;
+        this.imgOption.fileRefid = this.dataModel.id;
+      }
+    });
+  }
+
+  showBigImage(id) {
+    try {
+      var items = [];
+      let url = this.webServerHost + "/appApi/home/showImg/" + id;
+      let img = this.getImageWidth(url) || {width: 500, height: 300};
+      items.push({
+        src: url,
+        w: img.width || 500,
+        h: img.height || 300
+      })
+
+      this.photoSwipe.open(items, {
+        index: 0,
+        tapToClose: true
+      }, "pswp" + (Math.random() * 100000).toFixed(0).toString());
+    } catch (e) {
+      this.alertModal.alert("图片查看异常:" + e);
+    }
+  }
+
+  getImageWidth(url) {
+    let obj = {width: 0, height: 0}
+    try {
+      var img = new Image();
+      img.src = url;
+      // 如果图片被缓存,则直接返回缓存数据
+      if (img.complete) {
+        obj.width = img.width;
+        obj.height = img.height;
+        return obj
+      } else {
+        img.onload = function () {
+          obj.width = img.width;
+          obj.height = img.height;
+          return obj
+        }
+      }
+    } catch (e) {
+      this.alertModal.alert("图片高宽获取异常:" + e);
+      return obj;
+    }
+  }
+
+}

+ 71 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/edit/edit.component.html

@@ -0,0 +1,71 @@
+<ion-header class="header-theme2">
+  <ion-toolbar>
+    <ion-label class="title-center">{{title}}党组织生活</ion-label>
+    <ion-buttons slot="start">
+      <ion-back-button icon="ios-back2" defaultHref="/tapp/tabs/tabMain/propagandawork/dzzfc" text="" mode="md"></ion-back-button>
+    </ion-buttons>
+  </ion-toolbar>
+</ion-header>
+<ion-content>
+  <form #dataForm="ngForm" class="form-table">
+    <ion-item detail mode="md">
+      <ion-label>所属党组织<span class="danger">*</span></ion-label>
+      <app-partyselect [(dzzdm)]="dataModel.dzzdm" [(dzzmc)]="dataModel.dzzmc"></app-partyselect>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>主题名称<span class="danger">*</span></ion-label>
+      <ion-input #ztmc="ngModel" name="ztmc" id="ztmc" [(ngModel)]="dataModel.ztmc"
+                 placeholder="请输入主题名称" required></ion-input>
+    </ion-item>
+    <ion-item detail mode="md">
+      <ion-label>类别<span class="danger">*</span></ion-label>
+      <ion-select #fcType="ngModel" name="fcType"
+                  id="fcType"
+                  [(ngModel)]="dataModel.fcType" okText="确定" cancelText="取消" placeholder="请选择"
+                  interface="action-sheet" required>
+        <ion-select-option *ngFor="let item of fcTypeList"
+                           [value]="item.dickey">{{item.dicvalue}}</ion-select-option>
+      </ion-select>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>时间<span class="danger">*</span></ion-label>
+      <ion-datetime #sj="ngModel" displayFormat="YYYY-MM-DD" pickerFormat="YYYY MM DD"
+                    name="sj" id="sj"
+                    cancelText="取消" doneText="选择" placeholder="请选择时间"
+                    [(ngModel)]="dataModel.sj"
+                    required></ion-datetime>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>链接</ion-label>
+      <ion-input #lj="ngModel" name="lj" id="lj" [(ngModel)]="dataModel.lj"
+                 placeholder="请输链接"></ion-input>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>简介</ion-label>
+      <ion-textarea readonly="false" placeholder="请填写简介" name="jj"
+                    [(ngModel)]="dataModel.jj"></ion-textarea>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>内容</ion-label>
+      <ion-textarea readonly="false" placeholder="请填写内容" name="nr"
+                    [(ngModel)]="dataModel.nr"></ion-textarea>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>备注</ion-label>
+      <ion-textarea readonly="false" placeholder="请填写备注" name="remark"
+                    [(ngModel)]="dataModel.remark"></ion-textarea>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>上传图片</ion-label>
+    </ion-item>
+    <app-imglist [(imgOption)]="imgOption" [(imgList)]="imgList"></app-imglist>
+    <div class="footer-btn">
+      <ion-button slot="end" color="danger" mode="ios"
+                  (click)="save()" [disabled]="!dataForm.form.valid">
+        提交
+      </ion-button>
+    </div>
+  </form>
+</ion-content>
+<app-photo-swipe></app-photo-swipe>
+

+ 31 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/edit/edit.component.scss

@@ -0,0 +1,31 @@
+ion-content{
+  z-index: 11;
+}
+
+ion-select::part(icon) {
+  display: none;
+}
+
+app-partyselect{
+  width: 75%;
+}
+
+.detail-open::part(detail-icon){
+  transform: rotate(90deg);
+  transition: transform 0.2s ease-out;
+}
+
+.detail-close::part(detail-icon){
+  transform: rotate(0deg);
+  transition: transform 0.2s ease-out;
+}
+
+.item-img{
+  width: 80px;
+  height: 50px;
+  padding-right: 10px;
+}
+
+.item-detail{
+  margin: 0px !important;
+}

+ 138 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/edit/edit.component.ts

@@ -0,0 +1,138 @@
+import {Component, OnInit, ViewChild} 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 {AlertController, LoadingController, ModalController} from "@ionic/angular";
+import * as moment from 'moment';
+import {PhotoSwipeComponent} from "../../../../../comm/modal/photo-swipe/photo-swipe.component";
+import {DzzfcApi} from "../../../../../api/propagandawork/dzzfc";
+import {AlertModal} from "../../../../../comm/modal/alert";
+import {DictionaryApi} from "../../../../../api/system/dictionary";
+
+@Component({
+  selector: 'app-edit',
+  templateUrl: './edit.component.html',
+  styleUrls: ['./edit.component.scss'],
+})
+export class DzzfcEditComponent implements OnInit {
+
+  @ViewChild(PhotoSwipeComponent)
+  photoSwipe: PhotoSwipeComponent;
+
+  op: number = 0;
+  title: string = "新增";
+  dataModel: any = {};
+  fcTypeList: any = [];
+  detailOpen: boolean = false;
+  webServerHost: string = '';
+  imgOption: any = {
+    fileRefid: '',
+    fileName: '',
+    fileType: 4,
+    isMulti: true,
+    readonly: false
+  };
+  imgList = [];
+
+  constructor(private datePipe: DatePipe, private router: Router, private routeInfo: ActivatedRoute, private configService: ConfigService, private userService: UserService, public alertController: AlertController,
+              public modalController: ModalController, public loadingController: LoadingController
+    , private dzzfcApi: DzzfcApi, private alertModal: AlertModal, private dictionaryApi: DictionaryApi) {
+
+  }
+
+  ngOnInit() {
+    this.routeInfo.queryParams.subscribe(params => {
+      this.dataModel.id = params['id'];
+      this.imgOption.fileRefid = params['id'];
+      this.op = parseInt(params['op']);
+      this.title = this.op == 0 ? "新增" : "编辑";
+      this.getDictionList();
+      this.getData();
+    });
+
+    this.configService.GetConfig().subscribe((config) => {
+      this.webServerHost = config.webServerHost;
+    });
+  }
+
+  getData() {
+    this.dzzfcApi.getData(this.dataModel.id).subscribe((data: RequsetData) => {
+      if (data.success) {
+        this.dataModel = data.item;
+        this.imgOption.fileRefid = this.dataModel.id;
+      }
+    });
+  }
+
+  getDictionList() {
+    this.dictionaryApi.getDictionaryList('fcType').subscribe((data: RequsetData) => {
+      if (data.success) {
+        this.fcTypeList = data.item;
+      }
+    });
+  }
+
+  save() {
+    this.alertModal.loading("提交中...").then((loading) => {
+      this.dataModel.sj = moment(this.dataModel.sj).format("YYYY-MM-DD");
+      this.dzzfcApi.save(this.dataModel).subscribe((data: RequsetData) => {
+        loading.dismiss();
+        if (data.success) {
+          this.back();
+        }
+        this.alertModal.alert(data.msg);
+      }, () => {
+        loading.dismiss();
+      });
+    });
+  }
+
+  back() {
+    this.router.navigate(['../../dzzfc'], {relativeTo: this.routeInfo, queryParams: {random: Math.random()}});
+  }
+
+  showBigImage(id) {
+    try {
+      var items = [];
+      let url = this.webServerHost + "/appApi/home/showImg/" + id;
+      let img = this.getImageWidth(url) || {width: 500, height: 300};
+      items.push({
+        src: url,
+        w: img.width || 500,
+        h: img.height || 300
+      })
+
+      this.photoSwipe.open(items, {
+        index: 0,
+        tapToClose: true
+      }, "pswp" + (Math.random() * 100000).toFixed(0).toString());
+    } catch (e) {
+      this.alertModal.alert("图片查看异常:" + e);
+    }
+  }
+
+  getImageWidth(url) {
+    let obj = {width: 0, height: 0}
+    try {
+      var img = new Image();
+      img.src = url;
+      // 如果图片被缓存,则直接返回缓存数据
+      if (img.complete) {
+        obj.width = img.width;
+        obj.height = img.height;
+        return obj
+      } else {
+        img.onload = function () {
+          obj.width = img.width;
+          obj.height = img.height;
+          return obj
+        }
+      }
+    } catch (e) {
+      this.alertModal.alert("图片高宽获取异常:" + e);
+      return obj;
+    }
+  }
+
+}

+ 53 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/list.component.html

@@ -0,0 +1,53 @@
+<ion-header>
+  <ion-toolbar>
+    <ion-label>党组织风采</ion-label>
+    <ion-buttons slot="start">
+<!--      <ion-back-button icon="ios-back" mode="md"></ion-back-button>-->
+      <ion-back-button icon="ios-back2" defaultHref="/tapp/tabs/tabMain" text="" 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.dzzdm" (dzzdmChange)="reload()"></app-partysearch>
+  <ion-item class="item-filter">
+    <div slot="end" (click)="search()">
+      <span>条件筛选</span>
+      <ion-icon name="dj-search"></ion-icon>
+    </div>
+  </ion-item>
+</ion-header>
+<ion-content>
+  <ion-list>
+    <ion-item-sliding *ngFor="let item of dataList">
+      <ion-item detail  [routerLink]="['./edit']" [queryParams]="{id: item.id,op:1}">
+        <div class="item-img">
+          <app-bimage [(fileid)]="item.id"></app-bimage>
+        </div>
+        <ion-label>
+          <h2>{{item.ztmc}}<span class="dues-month">{{item.sj}}</span></h2>
+          <p>{{item.dzzmc}}</p>
+        </ion-label>
+      </ion-item>
+
+      <ion-item-options side="end">
+        <ion-item-option (click)="delete(item.id)">删除</ion-item-option>
+      </ion-item-options>
+    </ion-item-sliding>
+  </ion-list>
+  <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>
+
+

+ 42 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/list.component.scss

@@ -0,0 +1,42 @@
+ion-label {
+  margin: 3px !important;
+  padding: 0px;
+  white-space: normal !important;
+}
+.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-img{
+  width: 80px;
+  height: 50px;
+  padding-right: 10px;
+}
+

+ 146 - 0
parth5/parth5/src/app/views/pages/propagandawork/dzzfc/list.component.ts

@@ -0,0 +1,146 @@
+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 {SearchComponent} from "../../../../comm/modal/search/search.component";
+import {DzzfcApi, reqParams} from "../../../../api/propagandawork/dzzfc";
+import {AlertModal} from "../../../../comm/modal/alert";
+
+@Component({
+  selector: 'app-dzzfc-list',
+  templateUrl: './list.component.html',
+  styleUrls: ['./list.component.scss'],
+})
+export class DzzfcListComponent implements OnInit {
+
+  @ViewChild(IonInfiniteScroll, {static: true}) infiniteScroll: IonInfiniteScroll;
+
+  webServerHost: string = '';
+  userInfo: any = {};
+  dataList: any[] = [];
+  searchParams: reqParams = {
+    pageindex: 1,
+    pagesize: 15,
+    dzzdm: '',
+    ztmc: '',
+    fcType: null
+  };
+  total: number = 15;
+  fieldList: any[] = [{label: '主题名称', name: 'ztmc', type: 'text', value: '', placeholder: '输入主题名称'},
+    {
+      label: '类别',
+      name: 'fcType',
+      type: 'select',
+      value: '',
+      dicParams: {
+        getUrl: 'getDictionaryList',
+        dicTypeKey: 'fcType',
+        textField: 'dicvalue',
+        valueField: 'dickey',
+        ismulti: false
+      }
+    }
+  ];
+
+  constructor(private router: Router, private routeInfo: ActivatedRoute, private configService: ConfigService, private userService: UserService, public modalController: ModalController, private navCtrl: NavController
+    , private dzzfcApi: DzzfcApi, private alertModal: AlertModal) {
+  }
+
+  ngOnInit() {
+    this.userInfo = this.userService.GetUser();
+    this.routeInfo.queryParams.subscribe(params => {
+      this.searchParams.dzzdm = this.searchParams.dzzdm || this.userService.GetUser().dataDzzdm;
+      this.reload();
+    });
+    this.configService.GetConfig().subscribe((config) => {
+      this.webServerHost = config.webServerHost;
+    });
+  }
+
+  getList() {
+    this.dzzfcApi.getList(this.searchParams).subscribe((data: RequsetData) => {
+      if (data.success) {
+        this.dataList = this.dataList.concat(data.item.list);
+        this.total = data.item.total;
+      }
+    });
+  }
+
+  reload() {
+    this.dataList = [];
+    this.searchParams.pageindex = 1;
+    this.total = 15;
+    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();
+  }
+
+  searchChange(event) {
+    this.fieldList[0].value = event.detail.value;
+    this.searchParams.ztmc = event.detail.value;
+    this.reload();
+  }
+
+  async search() {
+    const modal = await this.modalController.create({
+      component: SearchComponent,
+      componentProps: {
+        'fieldList': this.fieldList
+      },
+      cssClass: 'search-modal'
+    });
+
+    await modal.present();
+
+    const {data} = await modal.onWillDismiss();
+    if (data && data.success) {
+      this.searchParams.ztmc = data.params.ztmc;
+      this.searchParams.fcType = data.params.fcType;
+      this.reload();
+    }
+  }
+
+  detail(item) {
+    this.router.navigate(['./detail'], {
+      relativeTo: this.routeInfo,
+      queryParams: {random: Math.random(),id: item.id}
+    });
+  }
+
+  add() {
+    this.router.navigate(['./edit'], {
+      relativeTo: this.routeInfo,
+      queryParams: {random: Math.random(), op: 0}
+    });
+  }
+
+  delete(id) {
+    this.alertModal.confirm("确认删除?", () => {
+      this.alertModal.loading("正在删除").then((loading) => {
+        this.dzzfcApi.delete(id).subscribe((fdata: RequsetData) => {
+          loading.dismiss();
+          if (fdata.success) {
+            this.reload();
+          }
+          this.alertModal.alert(fdata.msg);
+        }, () => {
+          loading.dismiss();
+        });
+      });
+    });
+  }
+
+}

+ 2 - 0
parth5/parth5/src/app/views/tapp/tab-main/tab-main.route.ts

@@ -5,6 +5,7 @@ import partyUserRoutes from "../../../routes/partyUser";
 import shykRoutes from "../../../routes/shyk";
 import partyDuesRoutes from "../../../routes/partyDues";
 import positionRoutes from "../../../routes/propagandawork/position";
+import dzzfcRoutes from "../../../routes/propagandawork/dzzfc";
 import examRoutes from "../../../routes/exam";
 
 export const routes: Routes = [
@@ -17,5 +18,6 @@ export const routes: Routes = [
   ...shykRoutes,
   ...partyDuesRoutes,
   ...positionRoutes,
+  ...dzzfcRoutes,
   ...examRoutes
 ];

+ 8 - 1
parth5/parth5/src/app/views/tapp/tabs/tabs.module.ts

@@ -61,6 +61,9 @@ import {CardComponent} from "../../pages/examtest/show/card/card.component";
 import {ResultComponent} from "../../pages/examtest/show/result/result.component";
 
 import { ExamtestComponent} from "../../pages/examtest/examtest.component";
+import {DzzfcListComponent} from "../../pages/propagandawork/dzzfc/list.component";
+import {DzzfcEditComponent} from "../../pages/propagandawork/dzzfc/edit/edit.component";
+import {DzzfcDetailComponent} from "../../pages/propagandawork/dzzfc/detail/detail.component";
 import {ShowComponent as ExamtestShowComponent} from "../../pages/examtest/show/show.component";
 import {ExamonlineComponent} from "../../pages/examonline/examonline.component";
 import {ShowpaperComponent} from "../../pages/examonline/showpaper/showpaper.component";
@@ -97,7 +100,11 @@ const pageComponents = [
   ResultComponent,
   ExamonlineComponent,
   ShowpaperComponent,
-  ShowpaperCardComponent
+  ShowpaperCardComponent,
+  ResultComponent,
+  DzzfcListComponent,
+  DzzfcEditComponent,
+  DzzfcDetailComponent
 ];
 
 const pubComponents = [

+ 53 - 1
src/main/java/com/ghsc/partybuild/controller/SHYKController.java

@@ -1,6 +1,5 @@
 package com.ghsc.partybuild.controller;
 
-import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.ghsc.partybuild.filter.exception.RespGenerstor;
@@ -1222,5 +1221,58 @@ public class SHYKController {
         return result;
     }
 
+    @ResponseBody
+    @GetMapping("/getMeetingStatisticsList")
+    public RequsetData<List<MeetingMonthTotalVo>> getMeetingStatisticsList(@RequestParam(required = false) String partyCode,
+                                                                           @RequestParam(required = false) String beginTime,
+                                                                           @RequestParam(required = false) String endTime) {
+
+        RequsetData<List<MeetingMonthTotalVo>> result = new RequsetData<>();
+        result.setItem(shykService.selectMeetingStatisticsList(partyCode, beginTime, endTime));
+        return result;
+    }
+
+    @RequestMapping(value = "/exportMeetingStatistics", method = RequestMethod.GET)
+    public void exportMeetingStatistics(HttpServletResponse response, @RequestParam(required = false) String dzzdm,
+                                        @RequestParam(required = false) String beginTime, @RequestParam(required = false) String endTime) throws Exception {
+
+        /**查询数据**/
+        List<CfDictionary> shyklxList = dictionaryService.getDictionaryListByDicTypeKey("shykType");
+        List<HashMap<String, Object>> partyList = partyService.getPartyList(1, 1000, dzzdm, null, null,null, null,null, null,null, null,null, null, null, null ,null, null, null, null, null).getList();
+        List<MeetingMonthTotalVo> meetingStatisticsList = shykService.selectMeetingStatisticsList(dzzdm, beginTime, endTime);
+
+        ExcelHelper excelHelper = new ExcelHelper();
+        ExcelHelper.ExcelData data = excelHelper.new ExcelData();
+
+        //列名
+        data.setName("党内生活统计");
+        List<String> titles = new ArrayList();
+        titles.add("序号");
+        titles.add("组织名称");
+        shyklxList.forEach(item->{
+            titles.add(item.getDicvalue());
+        });
+        data.setTitles(titles);
+
+        //数据
+        List<List<Object>> rows = new ArrayList();
+
+        int rowIndex = 1;
+        for (HashMap<String, Object> item : partyList) {
+            List<Object> row = new ArrayList();
+            row.add(rowIndex++);
+            row.add(item.get("DZZMC"));
+            shyklxList.forEach(type->{
+                MeetingMonthTotalVo meeting = meetingStatisticsList.stream().filter(x -> item.get("DZZDM").equals(x.getPartyCode()) && type.getDickey() == x.getShykType()).findFirst().orElse(null);
+                row.add(meeting == null ? 0 : meeting.getCount());
+            });
+            rows.add(row);
+        }
+        data.setRows(rows);
+
+        excelHelper.exportExcel(response, "党内生活统计.xlsx", data);
+    }
+
+
 }
 

+ 103 - 0
src/main/java/com/ghsc/partybuild/controller/app/AppDzzfcController.java

@@ -0,0 +1,103 @@
+package com.ghsc.partybuild.controller.app;
+
+import com.ghsc.partybuild.controller.jsonmodel.RequsetData;
+import com.ghsc.partybuild.service.UserService;
+import com.ghsc.partybuild.service.impl.PubDzzfcService;
+import com.ghsc.partybuild.util.DateUtils;
+import com.ghsc.partybuild.vo.publicity.PubDzzfcVo;
+import com.github.pagehelper.PageInfo;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+@Slf4j
+@RestController
+@RequestMapping(value = "/appApi/publicity/dzzfc")
+public class AppDzzfcController {
+    @Autowired
+    private PubDzzfcService pubDzzfcService;
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private DateUtils dateUtils;
+
+    @ResponseBody
+    @GetMapping("/getList")
+    public RequsetData<PageInfo<PubDzzfcVo>> getList(int pageindex, int pagesize, @RequestParam(required = false) String dzzdm,
+                                                     @RequestParam(required = false) String ztmc, @RequestParam(required = false) String fcType) {
+
+        RequsetData<PageInfo<PubDzzfcVo>> result = new RequsetData<>();
+        result.setItem(pubDzzfcService.getList(pageindex, pagesize, null, dzzdm, ztmc, fcType));
+        return result;
+    }
+
+    @ResponseBody
+    @GetMapping("/get")
+    public RequsetData<PubDzzfcVo> get(@RequestParam(required = false) String id) {
+        RequsetData<PubDzzfcVo> res = new RequsetData<>();
+
+        PubDzzfcVo model = pubDzzfcService.getPubDzzfcById(id);
+        if (model == null) {
+            model = new PubDzzfcVo();
+            model.setId(UUID.randomUUID().toString());
+        }
+
+        res.setItem(model);
+        return res;
+    }
+
+    @ResponseBody
+    @PostMapping("/save")
+    public RequsetData<String> save(@RequestBody PubDzzfcVo data) {
+        RequsetData<String> result = new RequsetData<String>();
+        int count = 0;
+        String message = "";
+
+        try {
+            count = pubDzzfcService.save(data, userService.getLoginUser().getUserid());
+        } catch (Exception e) {
+            e.printStackTrace();
+            message = e.toString();
+        }
+
+        if (count > 0) {
+            result.setSuccess(true);
+            result.setMsg("保存成功!");
+        } else {
+            result.setSuccess(false);
+            result.setMsg("保存失败!" + message);
+        }
+        return result;
+    }
+
+    @ResponseBody
+    @GetMapping("/delete")
+    public RequsetData<Integer> delete(@RequestParam String id) {
+        RequsetData<Integer> result = new RequsetData<>();
+        int count = 0;
+        String message = "";
+
+        try {
+            List<String> idList = new ArrayList<>();
+            idList.add(id);
+            count = pubDzzfcService.delete(idList);
+        } catch (Exception e) {
+            e.printStackTrace();
+            message = e.toString();
+        }
+
+        if (count > 0) {
+            result.setItem(count);
+            result.setSuccess(true);
+            result.setMsg("删除成功!");
+        } else {
+            result.setSuccess(false);
+            result.setMsg("删除失败!" + message);
+        }
+        return result;
+    }
+}

+ 2 - 2
src/main/java/com/ghsc/partybuild/controller/app/AppFileController.java

@@ -119,8 +119,8 @@ public class AppFileController {
     }
 
     @GetMapping("getImageBase64")
-    public RequsetData<ImageBase64Vo> getImageBase64(@RequestParam("fileId") String fileId) throws IOException {
-        return RespGenerstor.success(fileService.getImageBase64(fileId));
+    public RequsetData<ImageBase64Vo> getImageBase64(@RequestParam("id") String id, @RequestParam("type") String type) throws IOException {
+        return RespGenerstor.success(fileService.getImageBase64(id, type));
     }
 
     @PostMapping("uploadBase64")

+ 91 - 57
src/main/java/com/ghsc/partybuild/controller/app/AppHomeController.java

@@ -471,80 +471,114 @@ public class AppHomeController {
             if (cfUsers == null)
                 throw new Exception("");
 
-            request.setAttribute("UserLoginId", desDatas[0]);
+            res = loginSuccessBack(response, request, cfUsers);
+        } catch (Exception ex) {
+            res.setSuccess(false);
+            res.setMsg("用户名或密码错误!");
+        }
 
-            user.put("id", cfUsers.getUserid());
-            user.putAll(userService.extendUserPartyInfo((String) user.get("id")));
-            user.put("userid", user.get("id"));
-            user.put("username", user.get("name"));
+        return res;
+    }
 
+    @PostMapping("/loginByWxUserId")
+    public RequsetData<Map<String, Object>> loginByWxUserId(HttpServletResponse response, HttpServletRequest request, @RequestBody DesModel model) {
+        RequsetData<Map<String, Object>> res = new RequsetData<>();
+        Map<String, Object> user = new HashMap<>();
+
+        try {
+            String dataLogin = commonService.DesTokenData(model.getToken(), dateUtils.DateToDateTime(model.getTm()));
+            String[] desDatas = dataLogin.split("\\|");
 
-            List<CfRoles> userRoles = roleService.getRolesByUid(user.get("id").toString());
-            Map<String, Object> ext = new HashMap<>();
-            ext.put("userRoles", userRoles);
+            CfUsers cfUsers = userService.loginByWxUserId(desDatas[0]);
+            if (cfUsers == null)
+                throw new Exception("");
 
-            if (userRoles.size() > 0 && user.get("id") != null) {
-                String dataDzzdm = userService.getUserDzzdmForShowData(user.get("id").toString(), userRoles.get(0).getRoleid()), dataDzzmc = "";
-                if (!stringUtils.IsNullOrEmpty(dataDzzdm)) {
-                    ZzZzqkxx party = partyService.getPartyByDm(dataDzzdm);
-                    dataDzzmc = party != null ? party.getDzzmc() : "";
-                }
+            res = loginSuccessBack(response, request, cfUsers);
 
-                user.put("dataDzzdm", dataDzzdm);//数据范围
-                user.put("dataDzzmc", dataDzzmc);//数据范围
-                user.put("dataScope", userService.getUserDataScope(user.get("id").toString(), userRoles.get(0).getRoleid()));//数据范围
-            }
-            if (user.get("DZZDM") != null) {
-                //个人所属党委
-                ZzZzqkxx dwModel = partyService.getUserDwInfo(user.get("DZZDM").toString());
-                if (dwModel != null) {
-                    user.put("dwdm", dwModel.getDzzdm());
-                    user.put("dwmc", dwModel.getDzzmc());
-                }
+        } catch (Exception ex) {
+            res.setSuccess(false);
+            res.setMsg("用户名或密码错误!");
+        }
 
-                //个人所属党支部(总支)
-                ZzZzqkxx dzzModel = partyService.getUserDZZInfo(user.get("DZZDM").toString());
-                if (dzzModel != null) {
-                    user.put("dzbdm", dzzModel.getDzzdm());
-                    user.put("dzbmc", dzzModel.getDzzmc());
-                }
+        return res;
+    }
+
+    public RequsetData<Map<String, Object>> loginSuccessBack(HttpServletResponse response, HttpServletRequest request, CfUsers cfUsers) {
+        RequsetData<Map<String, Object>> res = new RequsetData<>();
+        Map<String, Object> user = new HashMap<>();
+
+        request.setAttribute("UserLoginId", cfUsers.getUsername());
+
+        user.put("id", cfUsers.getUserid());
+        user.putAll(userService.extendUserPartyInfo((String) user.get("id")));
+        user.put("userid", user.get("id"));
+        user.put("username", user.get("name"));
+
+        List<CfRoles> userRoles = roleService.getRolesByUid(user.get("id").toString());
+        Map<String, Object> ext = new HashMap<>();
+        ext.put("userRoles", userRoles);
+
+        if (userRoles.size() > 0 && user.get("id") != null) {
+            String dataDzzdm = userService.getUserDzzdmForShowData(user.get("id").toString(), userRoles.get(0).getRoleid()), dataDzzmc = "";
+            if (!stringUtils.IsNullOrEmpty(dataDzzdm)) {
+                ZzZzqkxx party = partyService.getPartyByDm(dataDzzdm);
+                dataDzzmc = party != null ? party.getDzzmc() : "";
             }
 
-            ext.put("userInfo", partyUserService.getUserInfo(cfUsers.getUserid()));
-            res.setExtdata(ext);
+            user.put("dataDzzdm", dataDzzdm);//数据范围
+            user.put("dataDzzmc", dataDzzmc);//数据范围
+            user.put("dataScope", userService.getUserDataScope(user.get("id").toString(), userRoles.get(0).getRoleid()));//数据范围
+        }
+        if (user.get("DZZDM") != null) {
+            //个人所属党委
+            ZzZzqkxx dwModel = partyService.getUserDwInfo(user.get("DZZDM").toString());
+            if (dwModel != null) {
+                user.put("dwdm", dwModel.getDzzdm());
+                user.put("dwmc", dwModel.getDzzmc());
+            }
 
-            CfLog log = new CfLog();
+            //个人所属党支部(总支)
+            ZzZzqkxx dzzModel = partyService.getUserDZZInfo(user.get("DZZDM").toString());
+            if (dzzModel != null) {
+                user.put("dzbdm", dzzModel.getDzzdm());
+                user.put("dzbmc", dzzModel.getDzzmc());
+            }
+        }
 
-            log.setRequestip(IpUtils.getIpAddr(request));
-            log.setOpmodule("用户登录");
-            log.setUserid(user.get("id").toString());
-            log.setLogtitle("login");
-            log.setClientinfo("App");
-            log.setResponsetime(0);
-            log.setIserror(0);
-            logService.SaveLog(log);
+        ext.put("userInfo", partyUserService.getUserInfo(cfUsers.getUserid()));
+        res.setExtdata(ext);
 
-            UsernamePasswordToken userToken = new UsernamePasswordToken(desDatas[0], desDatas[1].toUpperCase());
-            org.apache.shiro.subject.Subject currentUser = SecurityUtils.getSubject();
-            currentUser.login(userToken);
-            String token = jwtUtils.generateToken(cfUsers.getUserid());
+        CfLog log = new CfLog();
+        log.setRequestip(IpUtils.getIpAddr(request));
+        log.setOpmodule("用户登录");
+        log.setUserid(user.get("id").toString());
+        log.setLogtitle("login");
+        log.setClientinfo("App");
+        log.setResponsetime(0);
+        log.setIserror(0);
+        logService.SaveLog(log);
 
-            /*Cookie cookie = new Cookie(jwtUtils.getTokenName(), token);
-            cookie.setHttpOnly(true);
-            cookie.setPath("/");
-            response.addCookie(cookie);*/
+        UsernamePasswordToken userToken = new UsernamePasswordToken(cfUsers.getUsername(), cfUsers.getUserpwd().toUpperCase());
+        org.apache.shiro.subject.Subject currentUser = SecurityUtils.getSubject();
+        currentUser.login(userToken);
+        String token = jwtUtils.generateToken(cfUsers.getUserid());
 
-            user.put(jwtUtils.getTokenName(), token);
+        user.put(jwtUtils.getTokenName(), token);
 
-            res.setItem(user);
+        res.setItem(user);
 
-            res.setSuccess(true);
+        res.setSuccess(true);
 
-        } catch (Exception ex) {
-            res.setSuccess(false);
-            res.setMsg("用户名或密码错误!");
-        }
 
         return res;
     }
+
+    @PostMapping("/bindWxUserId")
+    public void bindWxUserId(@RequestBody Map<String, Object> reqMap) {
+        String userId = reqMap.get("userId").toString();
+        String wxUserId = reqMap.get("wxUserId").toString();
+
+        userService.bindWxUserId(userId, wxUserId);
+    }
+
 }

+ 0 - 2
src/main/java/com/ghsc/partybuild/mapper/PartyCQuery.java

@@ -93,10 +93,8 @@ public interface PartyCQuery {
     /**
      * 党组织树
      * @param parentCode
-     * @param isshowxz
      * @param dzzdm
      * @param onlyshow_dw
-     * @param zzfbType
      * @param showdxz
      * @return
      */

+ 2 - 0
src/main/java/com/ghsc/partybuild/mapper/SHYKCQuery.java

@@ -216,4 +216,6 @@ public interface SHYKCQuery {
 
     List<MeetingMonthTotalVo> selectMeetingMonthTotalList(@Param("partyCode") String partyCode, @Param("year") Integer year);
 
+    List<MeetingMonthTotalVo> selectMeetingStatisticsList(@Param("partyCode") String partyCode, @Param("beginTime") String beginTime, @Param("endTime") String endTime);
+
 }

+ 10 - 0
src/main/java/com/ghsc/partybuild/model/CfUsers.java

@@ -21,6 +21,8 @@ public class CfUsers {
 
     private String oausersfz;
 
+    private String wxuserid;
+
     public String getUserid() {
         return userid;
     }
@@ -92,4 +94,12 @@ public class CfUsers {
     public void setOausersfz(String oausersfz) {
         this.oausersfz = oausersfz == null ? null : oausersfz.trim();
     }
+
+    public String getWxuserid() {
+        return wxuserid;
+    }
+
+    public void setWxuserid(String wxuserid) {
+        this.wxuserid = wxuserid == null ? null : wxuserid.trim();
+    }
 }

+ 70 - 0
src/main/java/com/ghsc/partybuild/model/CfUsersExample.java

@@ -704,6 +704,76 @@ public class CfUsersExample {
             addCriterion("OAUSERSFZ not between", value1, value2, "oausersfz");
             return (Criteria) this;
         }
+
+        public Criteria andWxuseridIsNull() {
+            addCriterion("wxUserId is null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWxuseridIsNotNull() {
+            addCriterion("wxUserId is not null");
+            return (Criteria) this;
+        }
+
+        public Criteria andWxuseridEqualTo(String value) {
+            addCriterion("wxUserId =", value, "wxuserid");
+            return (Criteria) this;
+        }
+
+        public Criteria andWxuseridNotEqualTo(String value) {
+            addCriterion("wxUserId <>", value, "wxuserid");
+            return (Criteria) this;
+        }
+
+        public Criteria andWxuseridGreaterThan(String value) {
+            addCriterion("wxUserId >", value, "wxuserid");
+            return (Criteria) this;
+        }
+
+        public Criteria andWxuseridGreaterThanOrEqualTo(String value) {
+            addCriterion("wxUserId >=", value, "wxuserid");
+            return (Criteria) this;
+        }
+
+        public Criteria andWxuseridLessThan(String value) {
+            addCriterion("wxUserId <", value, "wxuserid");
+            return (Criteria) this;
+        }
+
+        public Criteria andWxuseridLessThanOrEqualTo(String value) {
+            addCriterion("wxUserId <=", value, "wxuserid");
+            return (Criteria) this;
+        }
+
+        public Criteria andWxuseridLike(String value) {
+            addCriterion("wxUserId like", value, "wxuserid");
+            return (Criteria) this;
+        }
+
+        public Criteria andWxuseridNotLike(String value) {
+            addCriterion("wxUserId not like", value, "wxuserid");
+            return (Criteria) this;
+        }
+
+        public Criteria andWxuseridIn(List<String> values) {
+            addCriterion("wxUserId in", values, "wxuserid");
+            return (Criteria) this;
+        }
+
+        public Criteria andWxuseridNotIn(List<String> values) {
+            addCriterion("wxUserId not in", values, "wxuserid");
+            return (Criteria) this;
+        }
+
+        public Criteria andWxuseridBetween(String value1, String value2) {
+            addCriterion("wxUserId between", value1, value2, "wxuserid");
+            return (Criteria) this;
+        }
+
+        public Criteria andWxuseridNotBetween(String value1, String value2) {
+            addCriterion("wxUserId not between", value1, value2, "wxuserid");
+            return (Criteria) this;
+        }
     }
 
     public static class Criteria extends GeneratedCriteria {

+ 17 - 2
src/main/java/com/ghsc/partybuild/service/FileService.java

@@ -13,6 +13,7 @@ import org.apache.commons.net.ftp.FTPClient;
 
 import com.github.pagehelper.PageInfo;
 import com.ghsc.partybuild.model.CfFile;
+import org.bouncycastle.jcajce.provider.drbg.DRBG;
 
 /**
  *
@@ -52,13 +53,21 @@ public interface FileService {
     String SaveFile(String file, String fileName, String fileRefID, String uid, Integer fileType);
 
     /**
-     * down
+     * down 根据fileId查询
      * @param fileId
      * @param os
      * @return
      */
     CfFile downFtpFile(String fileId, OutputStream os);
 
+    /**
+     * down 根据fileRefID查询 创建时间升序返回第一条数据
+     * @param fileRefID
+     * @param os
+     * @return
+     */
+    CfFile downFtpFile2(String fileRefID, OutputStream os);
+
     /**
      * 查询cf_file表附件
      * @param fileRefID
@@ -97,7 +106,13 @@ public interface FileService {
 
     String getFileBase64(String fileId) throws IOException;
 
-    ImageBase64Vo getImageBase64(String fileId) throws IOException;
+    /**
+     * 返回图片信息
+     * @param id
+     * @param type 1:fileId;2fileRefId
+     * @return
+     * */
+    ImageBase64Vo getImageBase64(String id, String type) throws IOException;
 
     Integer uploadBase64(List<UploadFileBase64Vo> fileList, String userId) throws IOException;
 

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

@@ -416,4 +416,5 @@ public interface SHYKService {
 
     List<MeetingMonthTotalVo> getMeetingMonthTotalList(String partyCode, Integer year);
 
+    List<MeetingMonthTotalVo> selectMeetingStatisticsList(String partyCode, String beginTime, String endTime);
 }

+ 4 - 0
src/main/java/com/ghsc/partybuild/service/UserService.java

@@ -412,4 +412,8 @@ public interface UserService {
 
     CfUsers login(String account,String password);
 
+    CfUsers loginByWxUserId(String wxUserId);
+
+    void bindWxUserId(String userId,String wxUserId);
+
 }

+ 48 - 4
src/main/java/com/ghsc/partybuild/service/impl/FileServiceImpl.java

@@ -259,8 +259,48 @@ public class FileServiceImpl implements FileService {
     }
 
     @Override
-    public CfFile downFtpFile(String fileId, OutputStream os) {
-        CfFile file = cfFileMapper.selectByPrimaryKey(fileId);
+    public CfFile downFtpFile(String id, OutputStream os) {
+        CfFile file = cfFileMapper.selectByPrimaryKey(id);
+
+        try {
+            FTPClient ftpClient = new FTPClient();
+            ftpHelper.connectToServer(ftpClient);
+            ftpClient.enterLocalPassiveMode();
+            ftpClient.setFileType(FTP.BINARY_FILE_TYPE);
+
+            ftpClient.retrieveFile(file.getFileurl(), os);
+            /*
+            FTPFile[] files = ftpClient.listFiles(file.getFileurl());
+
+            if(files.length>0){
+
+                String filePath=GetParentPath(file.getFileurl());
+
+                ftpClient.changeWorkingDirectory(filePath);
+
+
+            }*/
+
+            ftpHelper.closeConnect(ftpClient);
+
+        } catch (Exception ex) {
+            logger.error("downFtpFile,下载文件失败!", ex);
+            file = null;
+        }
+
+        return file;
+    }
+
+    @Override
+    public CfFile downFtpFile2(String id, OutputStream os) {
+        CfFileExample emp = new CfFileExample();
+        emp.or().andFilerefidEqualTo(id);
+        emp.setOrderByClause("createtime");
+        CfFile file = cfFileMapper.selectByExample(emp).stream().findFirst().orElse(null);
+
+        if(file == null){
+            return null;
+        }
 
         try {
             FTPClient ftpClient = new FTPClient();
@@ -451,13 +491,17 @@ public class FileServiceImpl implements FileService {
     }
 
     @Override
-    public ImageBase64Vo getImageBase64(String fileId) throws IOException {
+    public ImageBase64Vo getImageBase64(String id, String type) throws IOException {
         ImageBase64Vo result = new ImageBase64Vo();
 
         ByteArrayOutputStream bos = new ByteArrayOutputStream();
 
         try {
-            this.downFtpFile(fileId, bos);
+            if("1".equals(type)){
+                this.downFtpFile(id, bos);
+            }else {
+                this.downFtpFile2(id, bos);
+            }
 
             byte[] bytes = bos.toByteArray();
 

+ 3 - 3
src/main/java/com/ghsc/partybuild/service/impl/PartyUserServiceImpl.java

@@ -560,12 +560,12 @@ public class PartyUserServiceImpl implements PartyUserService {
 
         PageHelper.startPage(pageNum, pageSize);
 
-        boolean isLead = true;
+        /*boolean isLead = true;
         //包括领导人信息为空就不是相对接口
         if (curUserId != null) {
             isLead = appConfig.leadUids.contains(curUserId);
-        }
-        List<HashMap<String, Object>> list = partyUserCquery.selectPartyUserListForSearch(dzzdm, dzzmc, xm, csrq_begin, csrq_end, rdsj_begin, rdsj_end, zzsj_begin, zzsj_end, jg, dnzw, xzzw, jszw, xl, xb, gwzt, zzmm, mz, pxpy_year, pxpy_level, pxpy_type, sfzyxq, isLead, age_begin, age_end);
+        }*/
+        List<HashMap<String, Object>> list = partyUserCquery.selectPartyUserListForSearch(dzzdm, dzzmc, xm, csrq_begin, csrq_end, rdsj_begin, rdsj_end, zzsj_begin, zzsj_end, jg, dnzw, xzzw, jszw, xl, xb, gwzt, zzmm, mz, pxpy_year, pxpy_level, pxpy_type, sfzyxq, null, age_begin, age_end);
         PageInfo<HashMap<String, Object>> result = new PageInfo(list);
         return result;
 

+ 5 - 0
src/main/java/com/ghsc/partybuild/service/impl/SHYKServiceImpl.java

@@ -1226,4 +1226,9 @@ public class SHYKServiceImpl implements SHYKService {
         return shykcQuery.selectMeetingMonthTotalList(partyCode,year);
     }
 
+    @Override
+    public List<MeetingMonthTotalVo> selectMeetingStatisticsList(String partyCode, String beginTime, String endTime){
+        return shykcQuery.selectMeetingStatisticsList(partyCode, beginTime, endTime);
+    }
+
 }

+ 15 - 0
src/main/java/com/ghsc/partybuild/service/impl/UserServiceImpl.java

@@ -1280,4 +1280,19 @@ public class UserServiceImpl implements UserService {
 
         return cfUsersMapper.selectByExample(exp).stream().findFirst().orElse(null);
     }
+
+    public CfUsers loginByWxUserId(String wxUserId) {
+        CfUsersExample exp = new CfUsersExample();
+        CfUsersExample.Criteria cri = exp.or();
+        cri.andWxuseridEqualTo(wxUserId.trim());
+
+        return cfUsersMapper.selectByExample(exp).stream().findFirst().orElse(null);
+    }
+
+    public void bindWxUserId(String userId, String wxUserId) {
+        CfUsers cfUsers = cfUsersMapper.selectByPrimaryKey(userId);
+        cfUsers.setWxuserid(wxUserId);
+
+        cfUsersMapper.updateByPrimaryKey(cfUsers);
+    }
 }

+ 2 - 1
src/main/resources/application.yml

@@ -118,7 +118,8 @@ appconfig:
   app-fromSys: dangjian
   #模拟登陆密码
   auto-pwd: 123456
-  lead-uids: '2121217762,2121402851'
+  #模拟登陆密码
+  lead-uids: '127687'
   #特殊菜单过滤 a,a|b,b,c
   menu-dwids: '001091209135'
   safe-ext: '.jpg,.png,.gif,.zip,.rar,.7z,.xls,.xlsx,.doc,.docx,.pdf,.ppt,.pptx,.jpeg,.txt,.mp4,.avi'

+ 40 - 25
src/main/resources/mapping/CfUsersMapper.xml

@@ -11,6 +11,7 @@
     <result column="FORCELOGINOUT" jdbcType="DECIMAL" property="forceloginout" />
     <result column="OAUSERID" jdbcType="VARCHAR" property="oauserid" />
     <result column="OAUSERSFZ" jdbcType="VARCHAR" property="oausersfz" />
+    <result column="wxUserId" jdbcType="VARCHAR" property="wxuserid" />
   </resultMap>
   <sql id="Example_Where_Clause">
     <where>
@@ -72,7 +73,7 @@
   </sql>
   <sql id="Base_Column_List">
     USERID, APPLICATIONID, USERNAME, ISANONYMOUS, LASTACTIVITYDATE, USERPWD, FORCELOGINOUT, 
-    OAUSERID, OAUSERSFZ
+    OAUSERID, OAUSERSFZ, wxUserId
   </sql>
   <select id="selectByExample" parameterType="com.ghsc.partybuild.model.CfUsersExample" resultMap="BaseResultMap">
     select
@@ -89,7 +90,7 @@
     </if>
   </select>
   <select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
-    select
+    select 
     <include refid="Base_Column_List" />
     from cf_users
     where USERID = #{userid,jdbcType=VARCHAR}
@@ -105,14 +106,14 @@
     </if>
   </delete>
   <insert id="insert" parameterType="com.ghsc.partybuild.model.CfUsers">
-    insert into cf_users (USERID, APPLICATIONID, USERNAME,
-                          ISANONYMOUS, LASTACTIVITYDATE, USERPWD,
-                          FORCELOGINOUT, OAUSERID, OAUSERSFZ
-    )
-    values (#{userid,jdbcType=VARCHAR}, #{applicationid,jdbcType=VARCHAR}, #{username,jdbcType=VARCHAR},
-            #{isanonymous,jdbcType=INTEGER}, #{lastactivitydate,jdbcType=TIMESTAMP}, #{userpwd,jdbcType=VARCHAR},
-            #{forceloginout,jdbcType=DECIMAL}, #{oauserid,jdbcType=VARCHAR}, #{oausersfz,jdbcType=VARCHAR}
-           )
+    insert into cf_users (USERID, APPLICATIONID, USERNAME, 
+      ISANONYMOUS, LASTACTIVITYDATE, USERPWD, 
+      FORCELOGINOUT, OAUSERID, OAUSERSFZ, 
+      wxUserId)
+    values (#{userid,jdbcType=VARCHAR}, #{applicationid,jdbcType=VARCHAR}, #{username,jdbcType=VARCHAR}, 
+      #{isanonymous,jdbcType=INTEGER}, #{lastactivitydate,jdbcType=TIMESTAMP}, #{userpwd,jdbcType=VARCHAR}, 
+      #{forceloginout,jdbcType=DECIMAL}, #{oauserid,jdbcType=VARCHAR}, #{oausersfz,jdbcType=VARCHAR}, 
+      #{wxuserid,jdbcType=VARCHAR})
   </insert>
   <insert id="insertSelective" parameterType="com.ghsc.partybuild.model.CfUsers">
     insert into cf_users
@@ -144,6 +145,9 @@
       <if test="oausersfz != null">
         OAUSERSFZ,
       </if>
+      <if test="wxuserid != null">
+        wxUserId,
+      </if>
     </trim>
     <trim prefix="values (" suffix=")" suffixOverrides=",">
       <if test="userid != null">
@@ -173,6 +177,9 @@
       <if test="oausersfz != null">
         #{oausersfz,jdbcType=VARCHAR},
       </if>
+      <if test="wxuserid != null">
+        #{wxuserid,jdbcType=VARCHAR},
+      </if>
     </trim>
   </insert>
   <select id="countByExample" parameterType="com.ghsc.partybuild.model.CfUsersExample" resultType="java.lang.Long">
@@ -211,6 +218,9 @@
       <if test="record.oausersfz != null">
         OAUSERSFZ = #{record.oausersfz,jdbcType=VARCHAR},
       </if>
+      <if test="record.wxuserid != null">
+        wxUserId = #{record.wxuserid,jdbcType=VARCHAR},
+      </if>
     </set>
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
@@ -219,14 +229,15 @@
   <update id="updateByExample" parameterType="map">
     update cf_users
     set USERID = #{record.userid,jdbcType=VARCHAR},
-    APPLICATIONID = #{record.applicationid,jdbcType=VARCHAR},
-    USERNAME = #{record.username,jdbcType=VARCHAR},
-    ISANONYMOUS = #{record.isanonymous,jdbcType=INTEGER},
-    LASTACTIVITYDATE = #{record.lastactivitydate,jdbcType=TIMESTAMP},
-    USERPWD = #{record.userpwd,jdbcType=VARCHAR},
-    FORCELOGINOUT = #{record.forceloginout,jdbcType=DECIMAL},
-    OAUSERID = #{record.oauserid,jdbcType=VARCHAR},
-    OAUSERSFZ = #{record.oausersfz,jdbcType=VARCHAR}
+      APPLICATIONID = #{record.applicationid,jdbcType=VARCHAR},
+      USERNAME = #{record.username,jdbcType=VARCHAR},
+      ISANONYMOUS = #{record.isanonymous,jdbcType=INTEGER},
+      LASTACTIVITYDATE = #{record.lastactivitydate,jdbcType=TIMESTAMP},
+      USERPWD = #{record.userpwd,jdbcType=VARCHAR},
+      FORCELOGINOUT = #{record.forceloginout,jdbcType=DECIMAL},
+      OAUSERID = #{record.oauserid,jdbcType=VARCHAR},
+      OAUSERSFZ = #{record.oausersfz,jdbcType=VARCHAR},
+      wxUserId = #{record.wxuserid,jdbcType=VARCHAR}
     <if test="_parameter != null">
       <include refid="Update_By_Example_Where_Clause" />
     </if>
@@ -258,19 +269,23 @@
       <if test="oausersfz != null">
         OAUSERSFZ = #{oausersfz,jdbcType=VARCHAR},
       </if>
+      <if test="wxuserid != null">
+        wxUserId = #{wxuserid,jdbcType=VARCHAR},
+      </if>
     </set>
     where USERID = #{userid,jdbcType=VARCHAR}
   </update>
   <update id="updateByPrimaryKey" parameterType="com.ghsc.partybuild.model.CfUsers">
     update cf_users
     set APPLICATIONID = #{applicationid,jdbcType=VARCHAR},
-        USERNAME = #{username,jdbcType=VARCHAR},
-        ISANONYMOUS = #{isanonymous,jdbcType=INTEGER},
-        LASTACTIVITYDATE = #{lastactivitydate,jdbcType=TIMESTAMP},
-        USERPWD = #{userpwd,jdbcType=VARCHAR},
-        FORCELOGINOUT = #{forceloginout,jdbcType=DECIMAL},
-        OAUSERID = #{oauserid,jdbcType=VARCHAR},
-        OAUSERSFZ = #{oausersfz,jdbcType=VARCHAR}
+      USERNAME = #{username,jdbcType=VARCHAR},
+      ISANONYMOUS = #{isanonymous,jdbcType=INTEGER},
+      LASTACTIVITYDATE = #{lastactivitydate,jdbcType=TIMESTAMP},
+      USERPWD = #{userpwd,jdbcType=VARCHAR},
+      FORCELOGINOUT = #{forceloginout,jdbcType=DECIMAL},
+      OAUSERID = #{oauserid,jdbcType=VARCHAR},
+      OAUSERSFZ = #{oausersfz,jdbcType=VARCHAR},
+      wxUserId = #{wxuserid,jdbcType=VARCHAR}
     where USERID = #{userid,jdbcType=VARCHAR}
   </update>
 </mapper>

+ 2 - 2
src/main/resources/mapping/IntegratedQueryCQuery.xml

@@ -11,11 +11,11 @@
         from ZZ_ZZQKXX dep
         inner join ZZ_ZZQKXXFB depinfo on dep.DZZDM=depinfo.DZZDM
         inner join ZZZD_ZZLBDMNEW deptype on depinfo.ZZLB=deptype.BM
-        inner join ZZZD_JCZZFL depcate on depinfo.JCZZFL=depcate.BM
+        inner join ZZZD_JCZZFLNEW depcate on depinfo.JCZZFL=depcate.BM
         left join ZZ_BZJCXX ses on dep.DZZDM=ses.DZZDM and depinfo.LDJTJC=ses.LDJTJC
         where 1=1
         <if test="dzzmc != null and dzzmc != ''">
-            and dep.DZZMC like concat('%',#{dzzdm},'%')
+            and dep.DZZMC like concat('%',#{dzzmc},'%')
         </if>
         <if test="dzzdm != null and dzzdm != ''">
             and dep.DZZDM like concat('%',#{dzzdm},'%')

+ 1 - 1
src/main/resources/mapping/PartyCQuery.xml

@@ -260,7 +260,7 @@
         ) c on p.dzzdm=SUBSTR(c.DZZDM,1,LENGTH(c.DZZDM)-3)
         left join ZZ_DZZFBQK fbType on p.DZZDM = fbType.DZZDM
         where 1=1
-        and p.DZZDM like ''||#{parentCode}||'%'
+        and p.DZZDM like concat('',#{parentCode},'%')
         and length(p.DZZDM)=(length(#{parentCode})+3)
         <if test="dzzdm != null and dzzdm != ''">
             and p.DZZDM = #{dzzdm}

+ 11 - 11
src/main/resources/mapping/PartyUserCQuery.xml

@@ -54,7 +54,7 @@
             and us.ZWJB = #{zwjb}
         </if>
         <if test="sqrdrq_begin != null and sqrdrq_begin != ''">
-            and dj.JRZGZZRQ >= #{sqrdrq_begin}
+            and dj.JRZGZZRQ <![CDATA[ >= ]]> #{sqrdrq_begin}
         </if>
         <if test="sqrdrq_end != null and sqrdrq_end != ''">
             and dj.JRZGZZRQ <![CDATA[ <= ]]> #{sqrdrq_end}
@@ -307,7 +307,7 @@
             and us.zwjb = #{zwjb}
         </if>
         <if test="sqrdrq_begin != null and sqrdrq_begin != ''">
-            and us.sqrdrq >= #{sqrdrq_begin}
+            and us.sqrdrq <![CDATA[ >= ]]> #{sqrdrq_begin}
         </if>
         <if test="sqrdrq_end != null and sqrdrq_end != ''">
             and us.sqrdrq <![CDATA[ <= ]]> #{sqrdrq_end}
@@ -350,7 +350,7 @@
             and us.xm like concat('%',#{xm},'%')
         </if>
         <if test="zlzbrq_begin != null and zlzbrq_begin != ''">
-            and r.zlzbrq >= #{zlzbrq_begin}
+            and r.zlzbrq <![CDATA[ >= ]]> #{zlzbrq_begin}
         </if>
         <if test="zlzbrq_end != null and zlzbrq_end != ''">
             and r.zlzbrq <![CDATA[ <= ]]> #{zlzbrq_end}
@@ -501,7 +501,7 @@
         left join ZZ_DJXX dj on us.RYBM=dj.RYBM
         left join vw_partyduty uszw on us.rybm=uszw.rybm -- 党内职务名称
         left join (
-        select USERID from DJ_JLCFXX j where j.YXKSRQ <![CDATA[ <= ]]> CURDATE() and j.YXJSRQ>=CURDATE() group
+        select USERID from DJ_JLCFXX j where j.YXKSRQ <![CDATA[ <= ]]> CURDATE() and j.YXJSRQ <![CDATA[ >= ]]> CURDATE() group
         by USERID
         ) jlcf on us.RYBM=jlcf.USERID
         where 1=1
@@ -515,7 +515,7 @@
             and us.xm like concat('%',#{xm},'%')
         </if>
         <if test="csrq_begin != null and csrq_begin != ''">
-            and us.csrq >= #{csrq_begin}
+            and us.csrq <![CDATA[ >= ]]> #{csrq_begin}
         </if>
         <if test="csrq_end != null and csrq_end != ''">
             and us.csrq <![CDATA[ <= ]]> #{csrq_end}
@@ -527,13 +527,13 @@
             and usfb.NL <![CDATA[ <= ]]> #{age_end}
         </if>
         <if test="rdsj_begin != null and rdsj_begin != ''">
-            and dj.jrzgzzrq >= #{rdsj_begin}
+            and dj.jrzgzzrq <![CDATA[ >= ]]> #{rdsj_begin}
         </if>
         <if test="rdsj_end != null and rdsj_end != ''">
             and dj.jrzgzzrq <![CDATA[ <= ]]> #{rdsj_end}
         </if>
         <if test="zzsj_begin != null and zzsj_begin != ''">
-            and dj.zzrq >= #{zzsj_begin}
+            and dj.zzrq <![CDATA[ >= ]]> #{zzsj_begin}
         </if>
         <if test="zzsj_end != null and zzsj_end != ''">
             and dj.zzrq <![CDATA[ <= ]]> #{zzsj_end}
@@ -618,9 +618,9 @@
             </if>
             )
         </if>
-        <if test="!islead">
-            and usfb.leadtype != 1
-        </if>
+<!--        <if test="!islead">-->
+<!--            and usfb.leadtype != 1-->
+<!--        </if>-->
         <if test="sfzyxq != null">
             <if test="sfzyxq == 1">
                 and jlcf.USERID is not null
@@ -825,7 +825,7 @@
                           where us.RYZT in ('2', '3') and cast(substr(zd.JRZGZZRQ, 1, 6) as signed) <![CDATA[ <= ]]> #{yearMonth}
                                 and (fb.ISARCHIVE is null
                                          or fb.ISARCHIVE = 0
-                                         or (fb.ISARCHIVE = 1 and cast(substr(DATE_FORMAT(fb.archiveDate, '%Y%m%d'), 1, 6) as signed) >= #{yearMonth}))
+                                         or (fb.ISARCHIVE = 1 and cast(substr(DATE_FORMAT(fb.archiveDate, '%Y%m%d'), 1, 6) as signed) <![CDATA[ >= ]]> #{yearMonth}))
                       ) um
                           left join us_party_month upm on um.userCode=upm.userCode and upm.yearMonth=#{yearMonth}
         where upm.userCode is null

+ 18 - 1
src/main/resources/mapping/SHYKCQuery.xml

@@ -530,7 +530,7 @@
                m.SHYKTYPE,
                z.DZZMC as PARTYNAME ,
                m.PARTYCODE,
-               m.MEETINGADDRESS,
+               m.MEETINGADDRESS,partyList
                m.CHAIRUSER,
                m.RECORDUSER,
                m.BEGINTIME,
@@ -591,4 +591,21 @@
         group by m.partyCode,t.shyktype,year(m.BEGINTIME),month(m.BEGINTIME)
     </select>
 
+    <select id="selectMeetingStatisticsList" resultType="com.ghsc.partybuild.vo.shyk.MeetingMonthTotalVo">
+        select m.partyCode,t.shykType,count(1) as count
+        from SHYK_MEETING m
+            inner join shyk_meeting_type t on t.meetingId = m.meetingId
+        where 1=1
+        <if test="partyCode != null and partyCode != ''">
+            and m.partyCode like concat('',#{partyCode},'%')
+        </if>
+        <if test="beginTime != null and beginTime != '' ">
+            and m.beginTime <![CDATA[ >= ]]> date_format(#{beginTime},'%Y%m%d')
+        </if>
+        <if test="endTime != null and endTime != '' ">
+            and m.beginTime <![CDATA[ < ]]> date_add(date_format(#{endTime},'%Y%m%d'),interval 1 day)
+        </if>
+        group by m.partyCode,t.shyktype
+    </select>
+
 </mapper>

+ 52 - 56
src/main/resources/static/app/main/partyTwoExt/ztdrxx/summary.html

@@ -2,16 +2,9 @@
 <div class="dj-list">
     <div class="dj-list-body">
         <div party-tree data-selectdzzdm="selectparams.selectdzzdm" data-selectdzzmc="selectparams.selectdzzmc"
-             data-isshowxz="0"
-             data-parentcode="selectparams.parentcode"
-             data-parentname="selectparams.parentname"
-             data-dzzdm="selectparams.szdzzdm" data-userid="selectparams.userid"
-             data-dzzmc="selectparams.szdzzmc"
-             data-showtogglebtn="true"
-             data-onlyshowdw="selectparams.onlyshow_dw"
              data-zzfbtype="selectparams.zzfbType"
-             data-isunfold="selectparams.isunfold"
              data-defaultselected="selectparams.defaultselected"
+             data-isunfold="selectparams.isunfold"
         ></div>
         <div class="dj-list-content">
             <div class="card">
@@ -21,10 +14,10 @@
                         <div class="search-input">
                             <form class="form-horizontal">
                                 <div class="row clearfix form-inline">
-                                    <div class="col-lg-2 col-md-2 dj-label">
+                                    <div class="col-lg3 col-md-3 dj-label">
                                         <label>当前选中组织</label>
                                     </div>
-                                    <div class="col-lg-2 col-md-2">
+                                    <div class="col-lg3 col-md-3">
                                         <div class="form-group">
                                             <div class="form-line">
                                                 <div class="input-group input-group-search">
@@ -36,20 +29,33 @@
                                                 </div>
                                             </div>
                                         </div>
+                                    </div><div class="col-lg-2 col-md-2 dj-label">
+                                    <label>会议开始时间</label>
+                                </div>
+                                    <div class="col-lg-2 col-md-2">
+                                        <div class="form-group">
+                                            <div class="form-line">
+                                                <input name="beginTime" class="form-control" ng-change="search()"
+                                                       autocomplete="off"
+                                                       autoclose="true"
+                                                       data-date-format="yyyy-MM-dd" data-date-type="string"
+                                                       ng-model="selectparams.beginTime"
+                                                       placeholder="" bs-datepicker/>
+                                            </div>
+                                        </div>
                                     </div>
-                                    <div class="col-lg-2 col-md-2 col-sm-2 col-xs-2 dj-label">
-                                        <label>年度</label>
+                                    <div class="col-lg-2 col-md-2 dj-label">
+                                        <label>会议结束时间</label>
                                     </div>
-                                    <div class="col-lg-2 col-md-2 col-sm-2 col-xs-2">
+                                    <div class="col-lg-2 col-md-2">
                                         <div class="form-group">
                                             <div class="form-line">
-                                                <select class="form-control show-tick" ng-change="search()"
-                                                        ng-model="selectparams.year"
-                                                        ng-options="type.dickey as type.dicvalue for type in ndList"
-                                                        class="form-control"
-                                                        name="year">
-                                                    <option value="" selected>--全部--</option>
-                                                </select>
+                                                <input name="endTime" class="form-control" ng-change="search()"
+                                                       autocomplete="off"
+                                                       autoclose="true"
+                                                       data-date-format="yyyy-MM-dd" data-date-type="string"
+                                                       ng-model="selectparams.endTime"
+                                                       placeholder="" bs-datepicker/>
                                             </div>
                                         </div>
                                     </div>
@@ -58,11 +64,10 @@
                         </div>
                         <div class="search-btn" style="margin-right: 20px;">
                             <div style="min-width: 13em">
-
-                                <button  class="btn btn-default1"
+                                <button class="btn btn-default1"
                                         ng-click="search()">查询
                                 </button>
-                                <button  class="btn btn-default1 btn-reset"
+                                <button class="btn btn-default1 btn-reset"
                                         ng-click="reset()">重置
                                 </button>
                             </div>
@@ -70,44 +75,35 @@
                     </div>
                     <div class="search-btn" style="margin-right: 20px;">
                         <div style="float: right">
-                            <button class="btn  btn-default1"
-                                    ng-click="export()">导出
+                            <button class="btn btn-default1"
+                                    ng-click="exportData()">导出
                             </button>
                         </div>
                     </div>
                 </div>
                 <div class="body">
-                    <div class="zero-list-table-panel">
-                        <div class="zero-source-table-div">
-                            <table class="table table-bordered table-striped table-hover js-basic-example dataTable text-nowrap">
-                                <thead>
-                                <tr>
-                                    <th>序号</th>
-                                    <th>所属党组织</th>
-                                    <th>年度</th>
-                                    <th>党员大会</th>
-                                    <th>支委会</th>
-                                    <th>党小组会</th>
-                                    <th>党课</th>
-                                    <th>主题党日</th>
-                                </tr>
-                                </thead>
-                                <tbody>
-                                <tr ng-repeat="it in dataList">
-                                    <td scope="row" class="text-center">
-                                        {{selectparams.pagesize*(selectparams.pageindex-1)+$index+1}}
-                                    </td>
-                                    <td>{{it.DZZMC}}</td>
-                                    <td class="text-center">{{it.YEAR}}</td>
-                                    <td class="text-center" url="shykList" title='{{it["党员大会"]}}' link-tag params='{"dzzdm":"{{it["PARTYCODE"]}}","beginTime" :"{{selectparams.year}}-01-01","endTime" :"{{selectparams.year}}-12-31","shykType":1}' ></td>
-                                    <td class="text-center" url="shykList" title='{{it["支委会"]}}' link-tag params='{"dzzdm":"{{it["PARTYCODE"]}}","beginTime" :"{{selectparams.year}}-01-01","endTime" :"{{selectparams.year}}-12-31","shykType":2}' ></td>
-                                    <td class="text-center" url="shykList" title='{{it["党小组会"]}}' link-tag params='{"dzzdm":"{{it["PARTYCODE"]}}","beginTime" :"{{selectparams.year}}-01-01","endTime" :"{{selectparams.year}}-12-31","shykType":3}' ></td>
-                                    <td class="text-center" url="shykList" title='{{it["党课"]}}' link-tag params='{"dzzdm":"{{it["PARTYCODE"]}}","beginTime" :"{{selectparams.year}}-01-01","endTime" :"{{selectparams.year}}-12-31","shykType":4}' ></td>
-                                    <td class="text-center" url="ztdrxx" title='{{it["主题党日"]}}' link-tag params='{"dzzdm":"{{it["PARTYCODE"]}}","beginTime" :"{{selectparams.year}}-01-01","endTime" :"{{selectparams.year}}-12-31"}' ></td>
-                                </tr>
-                                </tbody>
-                            </table>
-                        </div>
+                    <div class="table-responsive list-table-panel table-adapt">
+                        <table class="gt-table gt-table-bordered gt-table-evenodd">
+                            <thead>
+                            <tr>
+                                <th>序号</th>
+                                <th>组织名称</th>
+                                <th ng-repeat="it in shyklxList">{{it.dicvalue}}</th>
+                            </tr>
+                            </thead>
+                            <tbody>
+                            <tr ng-repeat="it in partyList" fixed-table-header>
+                                <td class="text-center" style="background-color: #fff;">{{$index + 1}}</td>
+                                <td style="background-color: #fff;">{{it.DZZMC}}</td>
+                                <td ng-repeat="type in shyklxList" class="text-center">
+                                    {{getSettingTitle(it.DZZDM, type.dickey)}}
+                                </td>
+                            </tr>
+                            <tr ng-if="dataList.length<=0" ng-repeat="it in [1]" fixed-table-header>
+                                <td colspan="9" style="text-align:center">暂无数据</td>
+                            </tr>
+                            </tbody>
+                        </table>
                     </div>
                     <pagination data-pageindex="selectparams.pageindex" data-pagesize="selectparams.pagesize"
                                 data-ptotal="pageInfo.ptotal"></pagination>

+ 69 - 112
src/main/resources/static/app/main/partyTwoExt/ztdrxx/summary.js

@@ -1,154 +1,111 @@
 (function ($app) {
-    $app.module('gtPartyApp').controller('summaryCtrl', function ($scope, $http, $modal, $ocLazyLoad, $timeout,$alert, $loading, $state, AuthUser, $stateParams,$bsRouterState) {
-        $state.params = $bsRouterState.$params($scope);
-        $scope.isShow = false;
-        $scope.moreTxt = "更多";
-
+    $app.module('gtPartyApp').controller('summaryCtrl', function ($scope, $http, $modal, $ocLazyLoad, $alert, $loading, $state, $stateParams, AuthUser, $bsRouterState) {
 
         //定义数据集合
-        $scope.dataList = []; //列表数据
-        $scope.isDetail = true;
-        //初始化查询参数
+        $scope.loginUserId = AuthUser.getUser().Id;
+        $scope.partyList = []; //列表数据
+        $scope.meetingStatisticsList = [];
+        $scope.yearList = [];
+        $scope.quarterList = [];
         $scope.selectparams = {
-            isunfold: false,//组织结构树展开收缩
-            'pageindex': 1,
-            'pagesize':10,
-            'selectdzzdm': '',
-            selectdzzmc: '',
-            defaultselected: $state.params.dzzdm,
-            parentcode: AuthUser.getUser().ParentDpCode,
-            parentname: AuthUser.getUser().ParentDpName,
-            szdzzdm: AuthUser.getUser().DPCode,
-            szdzzmc: AuthUser.getUser().DPName,
-            dzzdm: '',
-            ldjtjc: '',
-            dzzmc: '',
-            xm: '',
-            zwmc: null,
-            rzfs: null,
-            userid: AuthUser.getUser().Id,
-            onlyshow_dw: $stateParams.type == 1 ? 1 : 0,
-            zzfbType: null,
-            year: $state.params.year == undefined ? new Date().getFullYear() : $state.params.year
-        };
-        $scope.resetparams = {
-            isunfold: false,//组织结构树展开收缩
-            'pageindex': 1,
-            'pagesize': 10,
-            'selectdzzdm': '',
+            selectdzzdm: '',
             selectdzzmc: '',
-            parentcode: AuthUser.getUser().ParentDpCode,
-            parentname: AuthUser.getUser().ParentDpName,
-            szdzzdm: AuthUser.getUser().DPCode,
-            szdzzmc: AuthUser.getUser().DPName,
-            dzzdm: '',
-            ldjtjc: '',
-            dzzmc: '',
-            xm: '',
-            zwmc: null,
-            rzfs: null,
-            userid: AuthUser.getUser().Id,
-            onlyshow_dw: $stateParams.type == 1 ? 1 : 0,
-            zzfbType: null
+            defaultselected: '',
+            pageindex: 1,
+            pagesize: 1000,
+            dzzdm: '',//党组织代码
+            isunfold: false,
+            beginTime: null,
+            endTime: null
         };
-        $scope.pageInfo = {ptotal: 0};
+        $scope.pageInfo = {ptotal: 0, mergetotal: 0};
+        $scope.resetparams = angular.copy($scope.selectparams);
+        $scope.shyklxList = [];
+
         //监视页数变化
         $scope.$watch("selectparams.pageindex", function (newVal, oldVal) {
             if ($scope.pageInfo.ptotal > 0) {
-                $scope.loadData();
+                $scope.getPartyList();
             }
         });
-        //监视党组织选中变化
-        $scope.$watch("selectparams.selectdzzdm", function (newVal, oldVal) {
-            if (newVal != '' && newVal != null) {
-
-                if ($scope.selectparams.defaultselected != "" && $scope.selectparams.defaultselected != null &&
-                    $scope.selectparams.defaultselected != $scope.selectparams.selectdzzdm)
-                    return;
-                $scope.selectparams.defaultselected = "";
 
+        $scope.$watch("selectparams.selectdzzdm", function (newVal, oldVal) {
+            if (newVal != "") {
                 $scope.selectparams.dzzdm = $scope.selectparams.selectdzzdm;
-                $scope.loadData();
-            }
-        });
-
-        $scope.$watch("selectparams.zzfbType", function (newVal, oldVal) {
-            if (newVal != oldVal) {
-                $scope.loadData();
+                $scope.getPartyList();
             }
         });
 
         //查询
         $scope.search = function () {
-            $scope.loadData();
+            $scope.getPartyList();
         };
 
-        //加载列表数据
-        $scope.loadData = function () {
+        $scope.getPartyList = function () {
             $http
             ({
-                method: 'get', url: '../../api/partyTowExt/getZtdrSummary', params: $scope.selectparams
+                method: 'get', url: '../../api/party/getPartyList', params: $scope.selectparams
             }).then(function (result) {
-                $scope.dataList = result.data.item.list;
-                $scope.pageInfo.ptotal = result.data.item.total;
+                $scope.partyList = result.data.item.list;
+                $scope.getTargetList();
             });
         };
-        $scope.getNdList = function () {
-            $http({
-                method: 'get',
-                url: '../../api/dictionary/getDictionaryListByDicTypeKey',
-                params: {
-                    dicTypeKey: 'years'
-                }
+
+        //加载列表数据
+        $scope.getTargetList = function () {
+            $http
+            ({
+                method: 'get', url: '../../api/shyk/getMeetingStatisticsList', params: $scope.selectparams
             }).then(function (result) {
-                $scope.ndList = result.data;
+                console.log(result.data.item)
+                $scope.meetingStatisticsList = result.data.item;
             }, function (resp) {
-
+                $scope.showMsg('错误', '服务器错误');
             });
         };
 
-        $scope.export = function () {
-            if ($scope.selectparams.dzzdm != "") {
-                var params = "?1=1";
-                for (var p in $scope.selectparams) {
-                    if ($scope.selectparams[p] !== '' && $scope.selectparams[p] !== null)
-                        params += ("&" + p + "=" + encodeURI($scope.selectparams[p]));
-                }
-                window.open('../../api/partyTowExt/exportZtdrSummary' + params);
-            }
+        $scope.getSettingTitle = function (partyCode, type) {
+            const settingVo = $scope.meetingStatisticsList.filter(e => e.shykType === type && e.partyCode === partyCode);
+            return settingVo.length > 0 ? settingVo[0].count : '0';
         };
-        //数据初始化
-        $scope.getNdList();
 
-        $scope.showMsg = function (title, content) {
-            $alert({
-                title: title + ':',
-                content: content,
-                placement: 'top',
-                type: 'info',
-                show: true,
-                duration: 3
-            });
+        $scope.isSetting = function (partyCode) {
+            return $scope.meetingStatisticsList.filter(e => e.partyCode === partyCode).length > 0;
+        };
 
+        $scope.exportData = function () {
+            var params = "?1=1";
+            for (var p in $scope.selectparams) {
+                if ($scope.selectparams[p] !== '' && $scope.selectparams[p] !== null)
+                    params += ("&" + p + "=" + encodeURI($scope.selectparams[p]));
+            }
+            window.open('../../api/shyk/exportMeetingStatistics' + params);
         };
         $scope.setisunfold = function () {
             $scope.selectparams.isunfold = !$scope.selectparams.isunfold;
             $scope.$emit('menudatas.toggle', !$scope.selectparams.isunfold);
         };
 
-        $scope.isShowClick = function(){
-            $scope.isShow=!$scope.isShow;
-            if($scope.moreTxt == "更多")
-            {
-                $scope.moreTxt = "收起";
-            }
-            else if($scope.moreTxt == "收起")
-            {
-                $scope.moreTxt = "更多";
-            }
+        $scope.getShyklxList = function () {
+            $http({
+                method: 'get',
+                url: '../../api/dictionary/getDictionaryListByDicTypeKey',
+                params: {
+                    dicTypeKey: 'shykType'
+                }
+            }).then(function (result) {
+                $scope.shyklxList = result.data;
+            }, function (resp) {
+
+            });
+        };
+
+        $scope.getShyklxList();
+
+        $scope.reset = function () {
+            $scope.selectparams = angular.copy($scope.resetparams);
+            $scope.selectparams.dzzdm = AuthUser.getUser().dwId;//党组织代码
+            $scope.getPartyList();
         };
-        $scope.reset  = function () {
-            $scope.selectparams.year = $state.params.year == undefined ? new Date().getFullYear() : $state.params.year;
-        }
     });
 })(angular);

+ 9 - 9
src/main/resources/static/app/main/report/partydetail/list.html

@@ -71,13 +71,13 @@
                                     <th rowspan="2">团委<br>党支部数</th>
                                     <!--<th rowspan="2">年度应换届<br>党支部数</th>-->
                                     <!--<th rowspan="2">党支部<br>年度换届率</th>-->
-                                    <th colspan="3">党支部书记数</th>
-                                </tr>
-                                <tr>
-                                    <th>专职</th>
-                                    <th>兼职</th>
-                                    <th>挂职副书记</th>
+<!--                                    <th colspan="3">党支部书记数</th>-->
                                 </tr>
+<!--                                <tr>-->
+<!--                                    <th>专职</th>-->
+<!--                                    <th>兼职</th>-->
+<!--                                    <th>挂职副书记</th>-->
+<!--                                </tr>-->
                                 </thead>
                                 <tbody>
                                 <tr ng-repeat="it in dataList">
@@ -93,9 +93,9 @@
                                     <td class="text-center"><a ng-click="showParty(it.DZZDM,'400','51')">{{it.NUM_DZB_LTX}}</a></td>
                                     <!--<td class="text-center"><a ng-click="showParty(it.DZZDM,'400',null,1)">{{it.NUM_YHJDZB}}</a></td>-->
                                     <!--<td class="text-center">{{it.NUM_REPLACERATE}}%</td>-->
-                                    <td class="text-center"><a ng-click="showPartyGroupUser(it.DZZDM,'1')">{{it.NUM_ZZ}}</a></td>
-                                    <td class="text-center"><a ng-click="showPartyGroupUser(it.DZZDM,'2')">{{it.NUM_JZ}}</a></td>
-                                    <td class="text-center"><a ng-click="showPartyGroupUser(it.DZZDM,'3')">{{it.NUM_GZ}}</a></td>
+<!--                                    <td class="text-center"><a ng-click="showPartyGroupUser(it.DZZDM,'1')">{{it.NUM_ZZ}}</a></td>-->
+<!--                                    <td class="text-center"><a ng-click="showPartyGroupUser(it.DZZDM,'2')">{{it.NUM_JZ}}</a></td>-->
+<!--                                    <td class="text-center"><a ng-click="showPartyGroupUser(it.DZZDM,'3')">{{it.NUM_GZ}}</a></td>-->
                                 </tr>
                                 <tr ng-if="pageInfo.ptotal==0">
                                     <td colspan="13" style="text-align:center">暂无数据</td>