Browse Source

app三會一課1

pengjing 8 months ago
parent
commit
22fecdb5f7
30 changed files with 3251 additions and 19 deletions
  1. 68 0
      parth5/parth5/src/app/api/partylife/shyk/index.ts
  2. 4 0
      parth5/parth5/src/app/comm/modal/empty/empty.component.html
  3. 19 0
      parth5/parth5/src/app/comm/modal/empty/empty.component.scss
  4. 14 0
      parth5/parth5/src/app/comm/modal/empty/empty.component.ts
  5. 7 0
      parth5/parth5/src/app/enum/OperateEnum.ts
  6. 15 0
      parth5/parth5/src/app/routes/shyk.ts
  7. 120 0
      parth5/parth5/src/app/views/pages/partylife/shyk/detail/detail.component.html
  8. 166 0
      parth5/parth5/src/app/views/pages/partylife/shyk/detail/detail.component.scss
  9. 594 0
      parth5/parth5/src/app/views/pages/partylife/shyk/detail/detail.component.ts
  10. 174 0
      parth5/parth5/src/app/views/pages/partylife/shyk/edit/edit.component.html
  11. 189 0
      parth5/parth5/src/app/views/pages/partylife/shyk/edit/edit.component.scss
  12. 445 0
      parth5/parth5/src/app/views/pages/partylife/shyk/edit/edit.component.ts
  13. 115 0
      parth5/parth5/src/app/views/pages/partylife/shyk/record/record.component.html
  14. 127 0
      parth5/parth5/src/app/views/pages/partylife/shyk/record/record.component.scss
  15. 464 0
      parth5/parth5/src/app/views/pages/partylife/shyk/record/record.component.ts
  16. 12 0
      parth5/parth5/src/app/views/pages/partylife/shyk/showtopic/showtopic.component.html
  17. 7 0
      parth5/parth5/src/app/views/pages/partylife/shyk/showtopic/showtopic.component.scss
  18. 38 0
      parth5/parth5/src/app/views/pages/partylife/shyk/showtopic/showtopic.component.ts
  19. 74 0
      parth5/parth5/src/app/views/pages/partylife/shyk/shyk.component.html
  20. 126 0
      parth5/parth5/src/app/views/pages/partylife/shyk/shyk.component.scss
  21. 27 0
      parth5/parth5/src/app/views/pages/partylife/shyk/shyk.component.spec.ts
  22. 228 0
      parth5/parth5/src/app/views/pages/partylife/shyk/shyk.component.ts
  23. 41 0
      parth5/parth5/src/app/views/pages/partylife/shyk/temp-user-select/temp-user-select.component.html
  24. 0 0
      parth5/parth5/src/app/views/pages/partylife/shyk/temp-user-select/temp-user-select.component.scss
  25. 144 0
      parth5/parth5/src/app/views/pages/partylife/shyk/temp-user-select/temp-user-select.component.ts
  26. 3 1
      parth5/parth5/src/app/views/tapp/tab-main/tab-main-routes.ts
  27. 22 1
      parth5/parth5/src/app/views/tapp/tab-main/tab-main.module.ts
  28. 1 1
      parth5/parth5/src/app/views/tapp/tab-main/tab-main.page.ts
  29. 2 2
      parth5/parth5/src/app/views/tapp/tabs/tabs-routing.module.ts
  30. 5 14
      src/main/java/com/ghsc/partybuild/controller/AppShykController.java

+ 68 - 0
parth5/parth5/src/app/api/partylife/shyk/index.ts

@@ -0,0 +1,68 @@
+import {Injectable} from "@angular/core";
+import {Observable} from "rxjs";
+import {ConfigService, RequsetData} from "../../../service/config.service";
+
+export interface reqParams {
+  pageIndex: number;
+  pageSize: number;
+  userId: string;
+  dzzdm: string;
+  dzzmc: string;
+  type: string;
+  shykType: string;
+  title: string;
+  startDate: string;
+  endDate: string;
+}
+
+
+@Injectable({providedIn: 'root'})
+export class SHYKApi {
+  constructor(private configService: ConfigService) {
+  }
+
+  getList(params: reqParams): Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/appApi/shyk/getMeetingList', params);
+  }
+
+  delete(id: string): Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/appApi/shyk/deleteMeetingById', {id: id});
+  }
+
+  getData(id: string): Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/appApi/shyk/getMeetingById', {id: id});
+  }
+
+  getTopicList(meetingId: string, shykType: number): Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/appApi/shyk/getTopicModelListOfChoose', {
+      meetingId: meetingId,
+      shykType: shykType
+    });
+  }
+
+  getMeetingUserList(meetingId: string): Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/appApi/shyk/getMeetingUserList', {
+      pageindex: 1,
+      pagesize: 1000,
+      meetingId: meetingId
+    });
+  }
+
+  getHistoryAddressList(userId: string): Observable<RequsetData> {
+    return this.configService.HttpGetRomote('/appApi/shyk/getHistoryAddressList', {userId: userId});
+  }
+
+  save(data: any, topicList: any, userList: any, userId: string, userName: string, isnotify: any, shykstatus: any): Observable<RequsetData> {
+    return this.configService.HttpPostRomote('/appApi/shyk/saveMeeting', {
+      dataModel: data,
+      topicList: JSON.stringify(topicList),
+      userList: JSON.stringify(userList),
+      userId: userId,
+      userName: userName,
+      isnotify: isnotify,
+      shykstatus: shykstatus
+    });
+  }
+
+}
+

+ 4 - 0
parth5/parth5/src/app/comm/modal/empty/empty.component.html

@@ -0,0 +1,4 @@
+<div class="not-notify">
+  <img class="building-img" src="assets/icon/message-warn.svg">
+  <ion-text class="building-text">暂无</ion-text>
+</div>

+ 19 - 0
parth5/parth5/src/app/comm/modal/empty/empty.component.scss

@@ -0,0 +1,19 @@
+.not-notify {
+  display: flex;
+  flex-direction: column;
+  margin: 15px 0;
+
+  .building-img {
+    width: 20%;
+    display: flex;
+    align-self: center;
+  }
+
+  .building-text {
+    margin-top: 10px;
+    text-align: center;
+    font-size: 13px;
+    color: #cdcdcd;
+    font-family: 宋体;
+  }
+}

+ 14 - 0
parth5/parth5/src/app/comm/modal/empty/empty.component.ts

@@ -0,0 +1,14 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-empty',
+  templateUrl: './empty.component.html',
+  styleUrls: ['./empty.component.scss'],
+})
+export class EmptyComponent implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {}
+
+}

+ 7 - 0
parth5/parth5/src/app/enum/OperateEnum.ts

@@ -0,0 +1,7 @@
+enum OperateEnum {
+  新增 = 1,
+  修改 = 2,
+  查看 = 3
+}
+
+export default OperateEnum;

+ 15 - 0
parth5/parth5/src/app/routes/shyk.ts

@@ -0,0 +1,15 @@
+import {Routes} from "@angular/router";
+import {ShykComponent} from "../views/pages/partylife/shyk/shyk.component";
+import {EditComponent} from "../views/pages/partylife/shyk/edit/edit.component";
+import {DetailComponent} from "../views/pages/partylife/shyk/detail/detail.component";
+import {RecordComponent} from "../views/pages/partylife/shyk/record/record.component";
+
+const routes: Routes = [
+  {path: 'shyk', component: ShykComponent,},
+  {path: 'shyk/add', component: EditComponent,},
+  {path: 'shyk/edit', component: EditComponent},
+  {path: 'shyk/detail', component: DetailComponent},
+  {path: 'shyk/record', component: RecordComponent}
+];
+
+export default routes;

+ 120 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/detail/detail.component.html

@@ -0,0 +1,120 @@
+<ion-header class="header-theme2">
+  <ion-toolbar>
+    <ion-label class="title-center">会议详情</ion-label>
+    <ion-buttons slot="start">
+      <ion-back-button icon="ios-back2" text="" mode="md"></ion-back-button>
+    </ion-buttons>
+  </ion-toolbar>
+</ion-header>
+<ion-content>
+  <!--会议信息-->
+  <form class="form-table">
+    <ion-item>
+      【{{shykTypeName}}】{{dataModel.partyname}}
+    </ion-item>
+    <ion-item>
+      <ion-label>会议类别</ion-label>
+      <ion-text>{{shykTypeName}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>会议时间</ion-label>
+      <ion-text style="white-space:normal;">
+        <span>{{dataModel.begintime|date:'yyyy-MM-dd HH:mm'}}</span>
+      </ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>所属组织</ion-label>
+      <ion-text>{{dataModel.partyname}}</ion-text>
+    </ion-item>
+    <ion-item style="--inner-border-width: 0px 0px 0px 0px;">
+      <ion-label *ngIf="dataModel.shyktype !=4">会议议题
+      </ion-label>
+      <ion-label *ngIf="dataModel.shyktype ==4">会议主题
+      </ion-label>
+    </ion-item>
+    <ion-item class="meeting-yiti">
+      <ion-text>
+        <div *ngFor="let it of topicList;let first=first;let index=index;"
+             ngClass="{{first?'':'meeting-yiti-item'}}" (click)="showTopic(it.MODELID)">
+          <span>{{index + 1}}、{{it.TOPICNAME}}</span>
+          <!--<img *ngIf="it.MODELID!=null && it.MODELID!=''" class="meeting-yiti-showimg"-->
+          <!--src="assets/icon/showlist.svg"/>-->
+          <br>
+        </div>
+      </ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>会议地点</ion-label>
+      <ion-text>{{dataModel.meetingaddress}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>主持人</ion-label>
+      <ion-text>{{dataModel.chairuser}}</ion-text>
+      <ion-label class="meeting-recorduser">记录人</ion-label>
+      <ion-text>{{dataModel.recorduser}}</ion-text>
+    </ion-item>
+    <!--<ion-item style="--inner-border-width: 0px 0px 0px 0px;">
+      <ion-label>会场照片</ion-label>
+    </ion-item>
+    <app-imglist [(imgOption)]="imgOption1"></app-imglist>
+    <ion-item style="--min-height: 1px;"></ion-item>-->
+    <ion-item style="--inner-border-width: 0px 0px 0px 0px;">
+      <ion-label>相关记录</ion-label>
+    </ion-item>
+    <app-imglist [(imgOption)]="imgOption2"></app-imglist>
+    <ion-item style="--min-height: 1px;"></ion-item>
+    <ion-item style="--inner-border-width: 0px 0px 0px 0px;">
+      <ion-label>参与人</ion-label>
+    </ion-item>
+    <!--<ion-item class="meeting-user">
+      <ion-row class="meeting-user-row" style="margin-left: 10px;margin-bottom: 10px;">
+        <ion-col size="12">
+          <ion-row class="user-item" *ngFor="let us of userList;let last = last">
+            <ion-col size="8">{{us.USERNAME}}</ion-col>
+            <ion-col size="3" (click)="editUserSignin(us)"><span
+              [ngClass]="isEditUser?'user-edit':''">{{us.SIGNINSTATUS==2?"参加":"未参加"}}</span></ion-col>
+          </ion-row>
+        </ion-col>
+      </ion-row>
+    </ion-item>-->
+    <ion-grid>
+      <ion-row>
+        <ion-col size="4">
+          姓名
+        </ion-col>
+        <ion-col size="4">
+          状态
+        </ion-col>
+        <!--<ion-col size="4" *ngIf="isEditUser">
+          操作
+        </ion-col>-->
+      </ion-row>
+      <ion-row *ngFor="let us of userList;let last = last">
+        <ion-col size="4">
+          {{us.USERNAME}}
+        </ion-col>
+        <ion-col size="4">
+          {{us.SIGNINSTATUS == 2 ? "参加" : "未参加"}}
+        </ion-col>
+        <!--<ion-col size="4" class="grid-btn" *ngIf="isEditUser">
+          <span (click)="editUserSignin(us)">修改</span>
+        </ion-col>-->
+      </ion-row>
+    </ion-grid>
+    <ion-item style="--inner-border-width: 0px 0px 0px 0px;margin: 10px 0px;">
+      <ion-text>
+        会议人员:{{userList.length}}人,确认参加:{{(userList | myfilter:'SIGNINSTATUS':'2').length }}
+        人,未参加:{{(userList | myfilter:'SIGNINSTATUS':'3').length }}人
+      </ion-text>
+    </ion-item>
+  </form>
+</ion-content>
+<ion-footer>
+  <div *ngIf="isEdit" class="toolbar-center"
+       style="text-align: right;">
+    <!--<ion-button *ngIf="isEdit" slot="end" color="danger" mode="ios"
+                (click)="editMeeting()">
+      管理
+    </ion-button>-->
+  </div>
+</ion-footer>

+ 166 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/detail/detail.component.scss

@@ -0,0 +1,166 @@
+ion-content{
+  z-index: 11;
+}
+
+ion-item {
+  --inner-border-width: 0px 0px 1px 0px;
+  margin-right: 10px;
+}
+.meeting-yiti {
+  height: auto !important;
+  /*margin: 5px 0px;*/
+  ion-label{
+    height: 100%;
+  }
+  ion-text {
+    margin: 2px 0 10px 10px;
+    .meeting-yiti-item {
+      padding-top: 5px;
+    }
+
+    .meeting-yiti-showimg {
+      height: 16px;
+      width: 16px;
+      vertical-align: middle;
+      padding-bottom: 2px;
+    }
+  }
+}
+
+.meeting-recorduser {
+  margin-left: 30px;
+}
+
+.meeting-user {
+  height: auto !important;
+  /*padding-bottom: 10px;*/
+  ion-label{
+    height: 100%;
+  }
+
+  .meeting-user-row {
+
+    .user-item {
+      padding-top: 2px;
+      color: #5E4545;
+
+      .user-edit {
+        background-color: #da2c36;
+        border-radius: 3px;
+        color: white;
+        font-size: 13px;
+        padding: 2px 5px;
+        height: 24px;
+        line-height: 24px;
+        width: 30px;
+      }
+    }
+  }
+
+  ion-row {
+    width: 100%;
+
+    ion-col {
+      padding: 0px 10px 0px 0px;
+    }
+  }
+
+  .xm-red {
+    color: red;
+  }
+}
+
+.meeting-user-study {
+  ion-item-divider {
+    border: none;
+    position: relative;
+
+    ion-label {
+      position: absolute;
+      top: 0px;
+      margin-top: 8px;
+    }
+
+    ion-textarea {
+      padding-left: 100px;
+    }
+  }
+
+}
+
+.meeting-imgs {
+  ion-item-divider {
+    border: none;
+  }
+
+  .img-list {
+    display: flex;
+    text-align: center;
+    flex-direction: row;
+    flex-wrap: wrap;
+    padding: 0 10px 10px 10px;
+
+    .img-item {
+      width: 25%;
+      position: relative;
+
+      img {
+        padding: 3px 5px;
+        height: 80px;
+        object-fit: cover;
+      }
+
+      .remove-icon {
+        position: absolute;
+        right: -3px;
+        top: -3px;
+      }
+
+      ion-button {
+        --box-shadow: 0px;
+        height: 73px;
+        width: 75px;
+      }
+    }
+  }
+}
+
+
+ion-grid {
+  padding: 0px;
+  color: #5E4545;
+
+  ion-row {
+    padding: 5px 12px;
+    border-bottom: 1px solid #F4F5F7;
+    margin: 0 10px 0 16px;
+
+    ion-col {
+      display: -webkit-box;
+      -webkit-box-orient: horizontal;
+      -webkit-box-align: center;
+    }
+
+    ion-col:not(:first-child) {
+      -webkit-box-pack: center;
+      text-align: center;
+    }
+
+    .grid-btn{
+      color: #007EFF;
+      cursor: pointer;
+      span{
+        margin: 0 5px;
+      }
+    }
+  }
+
+  ion-row:first-child {
+    font-size: 14px;
+    color: #998989;
+  }
+
+  ion-row:not(:first-child) {
+    background-color: white;
+  }
+}

+ 594 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/detail/detail.component.ts

@@ -0,0 +1,594 @@
+import {Component, OnInit} from '@angular/core';
+import {ActivatedRoute, Router} from "@angular/router";
+import {Config, ConfigService, RequsetData} from "../../../../../service/config.service";
+import {UserService} from "../../../../../service/user.service";
+import {AlertController, LoadingController} from "@ionic/angular";
+import {JsBridgeService} from "../../../../../service/js-bridge.service";
+import {DatePipe} from "@angular/common";
+import {interval} from 'rxjs';
+import {BaseComponent} from "../../../../../comm/base.component";
+import {takeUntil} from "rxjs/operators";
+
+@Component({
+  selector: 'app-detail',
+  templateUrl: './detail.component.html',
+  styleUrls: ['./detail.component.scss'],
+})
+export class DetailComponent extends BaseComponent {
+
+  secondsCounter = interval(10000);//定时器刷新成员签到状态(10秒)
+
+  loading: any = null;
+  userInfo: any = {};//当前用户信息
+
+  webServerHost: string = '';
+
+  getDataUrl: string = '/appApi/shyk/getMeetingById';//获取会议信息url
+  getTopicUrl: string = '/appApi/shyk/getMeetingTopicList';//获取议题url
+  getUserUrl: string = '/appApi/shyk/getMeetingUserList';//获取参会成员url
+
+  saveSigninUrl: string = '/appApi/shyk/signinMeeting';//保存签收信息
+  saveCheckinUrl: string = '/appApi/shyk/checkinMeeting';//保存签到信息
+  saveStudyUrl: string = '/appApi/shyk/saveUserStudy';//保存补学信息
+  clearMessageUrl: string = '/appApi/message/clearMessageByBusinessId';
+  cancelMeetingUrl: string = '/appApi/shyk/cancelMeeting';
+  cancelUserSigninUrl: string = '/appApi/shyk/cancelUserSignin';//取消签收信息
+  cancelUserCheckinUrl: string = '/appApi/shyk/cancelUserCheckin';//取消签到信息
+
+  meetingId: string = '';
+  dataModel: any = {};//会议信息
+  topicList: any = [];//议题
+  userList: any[] = [];//参会成员
+  meetingUserModel: any = {};//当前登录人会议信息
+  shykTypeName: string = '';//会议类型
+
+  //页面按钮权限操作
+  difftime: any = 0;//会议时间与当前时间差(分钟)
+  isEdit: any = false;//是否可编辑(会议状态,已取消的会议不可编辑)
+  isSigin: any = false;//是否可签收
+  isChecked: any = false;//是否可签到
+  isStudy: any = false;//是否需要补学
+  isEditStudy: any = false;//是否可填写补学情况
+  isShowimg: any = false;//是否可查看会议照片
+  isQrcode: any = false;//是否能查看会议二维码
+  isCancel: any = false;//是否可取消会议
+  isEditUser: any = false;//是否可操作成员签到
+  isEditRecord: any = false;//是否可录入会议记录
+
+  endTime: any;
+  beginTime: any;
+
+  imgOption1: any = {
+    fileRefid: '',
+    fileName: '',
+    fileType: 1,
+    isMulti: true,
+    readonly: true
+  };
+
+  imgOption2: any = {
+    fileRefid: '',
+    fileName: '',
+    fileType: 2,
+    isMulti: true,
+    readonly: true
+  };
+
+  constructor(private router: Router, private routeInfo: ActivatedRoute, private configService: ConfigService, private userService: UserService, public alertController: AlertController,
+              public loadingController: LoadingController, private jsBridgeService: JsBridgeService, private datePipe: DatePipe) {
+    super();
+  }
+
+  ngOnInit(): void {
+    this.userInfo = this.userService.GetUser();
+    this.configService.GetConfig().subscribe((config) => {
+      this.webServerHost = config.webServerHost;
+    });
+    this.routeInfo.queryParams.subscribe(params => {
+      this.meetingId = params['id'];
+      this.imgOption1.fileRefid = this.meetingId;
+      this.imgOption2.fileRefid = this.meetingId;
+      this.loadData();
+    });
+
+    this.secondsCounter.pipe(takeUntil(this.$destory)).subscribe(data => {
+      this.loadUserList();
+    });
+  }
+
+  loadData() {
+    this.configService.HttpGetRomote(this.getDataUrl, {
+      id: this.meetingId,
+      userId: this.userInfo.userid,
+      userName: this.userInfo.username
+    }).subscribe((data: RequsetData) => {
+      if (data.success) {
+        if (data.item != null) {
+          this.dataModel = data.item;
+          if (data.extdata.meetingUser != null) {
+            this.meetingUserModel = data.extdata.meetingUser;
+            if (this.userInfo.userid == this.meetingUserModel.usercode) {
+              this.clearMessage(this.userInfo.userid, 1);
+            }
+          }
+          this.shykTypeName = data.extdata.shykTypeName;
+          this.difftime = data.extdata.difftime;
+
+          this.endTime = new Date(this.datePipe.transform(this.dataModel.endtime, "yyyy/MM/dd HH:mm:ss"));
+          /*this.beginTime = new Date(this.datePipe.transform(this.dataModel.begintime, "yyyy/MM/dd HH:mm:ss"));*/
+
+          this.setPermiss();
+
+          this.loadUserList();
+          this.loadTopicList();
+        }
+      }
+    });
+  }
+
+  //操作权限设置
+  setPermiss() {
+    this.isEdit = this.dataModel.createuserid == this.userInfo.userid;
+    this.isCancel = this.dataModel.createuserid == this.userInfo.userid;
+    this.isEditUser = this.dataModel.createuserid == this.userInfo.userid;
+    /*this.isEdit = this.dataModel.createuserid == this.userInfo.userid && this.dataModel.shykstatus != 2;
+    //会议开始后可录入会议记录
+    this.isEditRecord = this.dataModel.createuserid == this.userInfo.userid && (this.dataModel.shykstatus == 1 || this.dataModel.shykstatus == 4 || this.dataModel.shykstatus == 5)
+                        && this.difftime <= 0 ;
+    //会议开始前可取消会议
+    this.isCancel = this.isEdit && this.difftime > 0;
+
+    //会议开始时间30分钟前,未签收或已签收参加的可请假(会议发起人不可请假)
+    this.isSigin = this.dataModel.shykstatus != 2 && this.difftime > 30 && (this.meetingUserModel.signinstatus == 1 || this.meetingUserModel.signinstatus == 2)
+      && this.dataModel.createuserid != this.userInfo.userid;
+
+    //会议开始时间前30分钟到会议结束前,未签到的可进行签到
+    this.isChecked = this.dataModel.shykstatus != 2 && this.difftime <= 30 && new Date() <= this.endTime && this.meetingUserModel.checkinstatus == 0;
+
+    //会议开始时间前30分钟到会议结束前,会议发起人或已签到人员可查看二维码
+    this.isQrcode = this.dataModel.shykstatus != 2 && this.difftime <= 30 && new Date() <= this.endTime
+      && (this.dataModel.createuserid == this.userInfo.userid || this.meetingUserModel.checkinstatus == 1);
+
+    //查看图片
+    this.isShowimg = this.dataModel.isuploadimg == 1;
+
+    //已录入会议记录,未参加会议的成员需录入补学情况
+    this.isStudy = this.dataModel.meetingrecordstate == 1 && (this.meetingUserModel.signinstatus == 1 || this.meetingUserModel.signinstatus == 3);
+    this.isEditStudy = (this.meetingUserModel.makeuupstudy == null || this.meetingUserModel.makeuupstudy == '');//未录入补学情况
+
+    //会议开始后可以在后台协助签到,录入会议记录后不允许签到
+    this.isEditUser = this.difftime <= 0
+      //&& this.dataModel.meetingrecordstate != 1
+      && this.dataModel.createuserid == this.userInfo.userid
+      && this.dataModel.shykstatus != 0 && this.dataModel.shykstatus != 2;*/
+
+  }
+
+  loadUserList() {
+    this.configService.HttpGetRomote(this.getUserUrl, {
+      pageindex: 1,
+      pagesize: 10000,
+      meetingId: this.meetingId,
+    }).subscribe((data: RequsetData) => {
+      if (data.success) {
+        if (data.item != null) {
+          this.userList = data.item.list;
+          /*if (this.dataModel.createuserid != this.userInfo.userid && this.dataModel.partycode.length == this.userService.GetUser().dataDzzdm.length) {
+            this.userList = this.userList.filter(it => it.USERCODE == this.userInfo.userid);
+          }*/
+        }
+      }
+    });
+  }
+
+  loadTopicList() {
+    this.configService.HttpGetRomote(this.getTopicUrl, {
+      meetingId: this.meetingId,
+    }).subscribe((data: RequsetData) => {
+      if (data.success) {
+        if (data.item != null) {
+          this.topicList = data.item;
+        }
+      }
+    });
+  }
+
+  //签收
+  signin(isback, userId, isSignin, userremark) {
+    this.presentAlertConfirm(isSignin ? "确认参加?" : "确认请假?", () => {
+      this.presentLoading("提交中...").then(val => {
+        this.configService.HttpPostRomote(this.saveSigninUrl, {
+          meetingId: this.dataModel.meetingid,
+          userCode: userId,
+          isSignin: isSignin,
+          userId: this.userInfo.userid,
+          userName: this.userInfo.username,
+          userRemark: !isSignin ? userremark : ""
+        }).subscribe((fdata: RequsetData) => {
+          this.loading.dismiss();
+          if (fdata.success) {
+            if (isback) {
+              this.backPage();
+            } else {
+              this.loadUserList();
+            }
+          }
+          this.presentAlert(fdata.msg);
+        });
+      });
+    });
+  }
+
+  //签到
+  checkin(isback, userId: string) {
+    //验证成功进行签到
+    this.presentLoading("签到中...").then(val => {
+      this.configService.HttpPostRomote(this.saveCheckinUrl, {
+        meetingId: this.dataModel.meetingid,
+        userCode: userId,
+        userId: this.userInfo.userid,
+        userName: this.userInfo.username
+      }).subscribe((fdata: RequsetData) => {
+        this.loading.dismiss();
+        if (fdata.success) {
+          if (isback) {
+            this.backPage();
+          } else {
+            this.loadUserList();
+          }
+        }
+        this.presentAlert(fdata.msg);
+      });
+    });
+  }
+
+  //二维码签到
+  scanQRCode() {
+    this.jsBridgeService.ScanQRCode().subscribe(req => {
+      if (req.success == false) {
+        this.presentAlert(req.error);
+        return false;
+      }
+      if (req.data.qrcode != this.dataModel.meetingid) {
+        this.presentAlert("会议二维码不匹配!");
+        return false;
+      }
+      if (new Date() > this.endTime) {
+        this.presentAlert("请在会议结束前进行签到!");
+        return false;
+      }
+
+      //验证成功进行签到
+      this.checkin(true, this.userInfo.userid);
+    });
+  }
+
+  //保存补学补课情况
+  saveStudy() {
+    this.presentLoading("提交中...").then(val => {
+      this.configService.HttpPostRomote(this.saveStudyUrl, {
+        meetingId: this.dataModel.meetingid,
+        userCode: this.userInfo.userid,
+        makeuupstudy: this.meetingUserModel.makeuupstudy,
+        userId: this.userInfo.userid,
+        userName: this.userInfo.username,
+      }).subscribe((fdata: RequsetData) => {
+        this.loading.dismiss();
+        if (fdata.success) {
+          this.clearMessage(this.userInfo.userid, 2);
+          this.backPage();
+        }
+        this.presentAlert(fdata.msg);
+      });
+    });
+  }
+
+  //查看二维码
+  showQrcode() {
+    this.configService.GetConfig().subscribe((config) => {
+      var url = config.webServerHost + "/appApi/home/ShowQRCode?code=" + encodeURI(this.dataModel.meetingid)
+      this.presentAlertQrcode(url);
+    });
+  }
+
+  //清除通知
+  clearMessage(userId: string, messageType) {
+    this.configService.HttpGetRomote(this.clearMessageUrl, {
+      businessId: this.dataModel.meetingid,
+      userId: userId,
+      messageType: messageType
+    }).subscribe((fdata: RequsetData) => {
+
+    });
+  }
+
+  //管理员操作人员签收
+  editUserSignin(user) {
+    /*if (user.SIGNINSTATUS == 1 && this.isEditUser) {
+      this.presentAlertUserSignin(user);//签收
+    }
+
+    if ((user.SIGNINSTATUS == 2 || user.SIGNINSTATUS == 3) && this.isEditUser) {
+      this.presentAlertUserSignin_Cancel(user);//取消签收
+    }*/
+    if (this.isEditUser) {
+      this.presentAlertUserSignin(user);//签收
+    }
+  }
+
+  //管理员操作人员签到
+  editUserCheckin(user) {
+    if (user.CHECKINSTATUS == 0 && this.isEditUser) {
+      this.presentAlertUserCheckin(user);//签到
+    }
+
+    if (user.CHECKINSTATUS == 1 && this.isEditUser) {
+      this.presentAlertUserCheckin_Cancel(user);//取消签到
+    }
+  }
+
+  //取消会议
+  cancel() {
+    this.presentAlertConfirm("确认取消会议?", () => {
+      this.presentLoading("取消中...").then(val => {
+        this.configService.HttpPostRomote(this.cancelMeetingUrl, {
+          meetingId: this.dataModel.meetingid,
+          userId: this.userInfo.userid,
+          userName: this.userInfo.username
+        }).subscribe((fdata: RequsetData) => {
+          this.loading.dismiss();
+          if (fdata.success) {
+            this.backPage();
+          }
+          this.presentAlert(fdata.msg);
+        });
+      });
+    });
+  }
+
+  showTopic(id) {
+    if (id != null && id != '') {
+      //this.router.navigate(['/main/tabs/tab1/shykshowtopic'], {queryParams: {id: id, random: Math.random()}});
+      this.router.navigate(['../shykshowtopic'], {
+        relativeTo: this.routeInfo,
+        queryParams: {id: id, random: Math.random()}
+      });
+    }
+  }
+
+  //请假
+  editUserLeave() {
+    this.presentAlertUserLeave();
+  }
+
+  editMeeting() {
+    this.router.navigate(['../shykEdit'], {
+      relativeTo: this.routeInfo,
+      queryParams: {id: this.dataModel.meetingid, random: Math.random()}
+    });
+  }
+
+  editRecord() {
+    this.router.navigate(['../shykrecord'], {
+      relativeTo: this.routeInfo,
+      queryParams: {id: this.dataModel.meetingid, random: Math.random()}
+    });
+  }
+
+  async presentLoading(msg: string) {
+    this.loading = await this.loadingController.create({
+      message: msg,
+      spinner: 'circles'
+    });
+    return this.loading.present();
+  }
+
+  async presentAlert(msg: string) {
+    const alert = await this.alertController.create({
+      header: '提示',
+      subHeader: '',
+      message: msg,
+      buttons: ['确定']
+    });
+
+    await alert.present();
+  }
+
+  async presentAlertConfirm(msg: string, handler) {
+    const alert = await this.alertController.create({
+      header: '提示',
+      message: '<strong>' + msg + '</strong>',
+      buttons: [
+        {
+          text: '关闭',
+          role: 'cancel',
+          cssClass: 'secondary',
+          handler: () => {
+
+          }
+        }, {
+          text: '确定',
+          handler: handler
+        }
+      ]
+    });
+
+    await alert.present();
+  }
+
+  async presentAlertQrcode(url) {
+    const alert = await this.alertController.create({
+      header: '会议二维码',
+      message: '<img src="' + url + '"/>',
+      buttons: ['关闭']
+    });
+
+    await alert.present();
+  }
+
+  async presentAlertUserSignin(user) {
+    const alert = await this.alertController.create({
+      header: user.USERNAME,
+      inputs: [
+        {
+          name: 'userremark',
+          type: 'text',
+          placeholder: '请输入未参加原因',
+          value: user.USERREMARK
+        }
+      ],
+      buttons: [{
+        text: '未参加',
+        handler: (result) => {
+          if (result.userremark == "" || result.userremark == null) {
+            this.presentAlert("请填写未参加原因");
+            return false;
+          }
+          this.signin(false, user.USERCODE, false, result.userremark);
+
+          this.clearMessage(user.USERCODE, 1);
+        }
+      }, {
+        text: '参加',
+        handler: (result) => {
+          this.signin(false, user.USERCODE, true, "");
+
+          this.clearMessage(user.USERCODE, 1);
+        }
+      }]
+    });
+
+    await alert.present();
+  }
+
+  async presentAlertUserCheckin(user) {
+    const alert = await this.alertController.create({
+      header: user.USERNAME,
+      buttons: [{
+        text: '关闭',
+        role: 'cancel',
+        cssClass: 'secondary',
+        handler: () => {
+
+        }
+      }, {
+        text: '签到',
+        handler: (result) => {
+          this.checkin(false, user.USERCODE);
+
+          this.clearMessage(user.USERCODE, 1);
+        }
+      }]
+    });
+
+    await alert.present();
+  }
+
+  //请假
+  async presentAlertUserLeave() {
+    const alert = await this.alertController.create({
+      header: '请假',
+      inputs: [
+        {
+          name: 'userremark',
+          type: 'text',
+          placeholder: '请输入未参加原因',
+          value: this.meetingUserModel.userremark
+        }
+      ],
+      buttons: [{
+        text: '请假',
+        handler: (result) => {
+          if (result.userremark == "" || result.userremark == null) {
+            this.presentAlert("请填写未参加原因");
+            return false;
+          }
+          this.signin(true, this.userInfo.userid, false, result.userremark);
+
+          this.clearMessage(this.userInfo.userid, 1);
+        }
+      }]
+    });
+
+    await alert.present();
+  }
+
+
+  async presentAlertUserSignin_Cancel(user) {
+    const alert = await this.alertController.create({
+      header: user.USERNAME,
+      message: "取消会议签收?",
+      buttons: [{
+        text: '关闭',
+        role: 'cancel',
+        cssClass: 'secondary',
+        handler: () => {
+
+        }
+      }, {
+        text: '确认',
+        handler: (result) => {
+          this.presentLoading("取消中...").then(val => {
+            this.configService.HttpPostRomote(this.cancelUserSigninUrl, {
+              meetingId: this.dataModel.meetingid,
+              userCode: user.USERCODE,
+              userId: this.userInfo.userid,
+              userName: this.userInfo.username
+            }).subscribe((fdata: RequsetData) => {
+              this.loading.dismiss();
+              if (fdata.success) {
+                this.loadUserList();
+              }
+              this.presentAlert(fdata.msg);
+            });
+          });
+        }
+      }]
+    });
+
+    await alert.present();
+  }
+
+  async presentAlertUserCheckin_Cancel(user) {
+    const alert = await this.alertController.create({
+      header: user.USERNAME,
+      message: "取消签到?",
+      buttons: [{
+        text: '关闭',
+        role: 'cancel',
+        cssClass: 'secondary',
+        handler: () => {
+
+        }
+      }, {
+        text: '确认',
+        handler: (result) => {
+          this.presentLoading("取消中...").then(val => {
+            this.configService.HttpPostRomote(this.cancelUserCheckinUrl, {
+              meetingId: this.dataModel.meetingid,
+              userCode: user.USERCODE,
+              userId: this.userInfo.userid,
+              userName: this.userInfo.username
+            }).subscribe((fdata: RequsetData) => {
+              this.loading.dismiss();
+              if (fdata.success) {
+                this.loadUserList();
+              }
+              this.presentAlert(fdata.msg);
+            });
+          });
+        }
+      }]
+    });
+
+    await alert.present();
+  }
+
+  //跳转页面
+  backPage() {
+    //this.router.navigate(['/main/tabs/tab1/shykindex'], {queryParams: {random: Math.random()}});
+
+    //this.router.navigate(['/main/tabs/tab1/shykindex', {random: Math.random()}]);
+    this.router.navigate(['../shykindex'], {relativeTo: this.routeInfo});
+  }
+}

+ 174 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/edit/edit.component.html

@@ -0,0 +1,174 @@
+<ion-header class="header-theme2">
+  <ion-toolbar>
+    <ion-label class="title-center">发布会议</ion-label>
+    <ion-buttons slot="start">
+      <ion-back-button icon="ios-back2" text="" mode="md"></ion-back-button>
+    </ion-buttons>
+  </ion-toolbar>
+</ion-header>
+<ion-content>
+  <form #dataForm="ngForm" class="form-table">
+    <ion-item detail mode="md">
+      <ion-label>会议类别
+        <span class="danger">*</span>
+      </ion-label>
+      <ion-select #v_meetingtype_select="ngModel" name="v_meetingtype_select"
+                  id="v_meetingtype_select"
+                  [(ngModel)]="dataModel.shyktype" okText="确定" cancelText="取消"
+                  interface="action-sheet" (ngModelChange)="changeType()" required>
+        <ion-select-option *ngFor="let item of typeList"
+                           [value]="item.id">{{item.name}}</ion-select-option>
+      </ion-select>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label *ngIf="dataModel.shyktype !=4">会议议题
+        <span class="danger">*</span>
+      </ion-label>
+      <ion-label *ngIf="dataModel.shyktype ==4">会议主题
+        <span class="danger">*</span>
+      </ion-label>
+    </ion-item>
+    <div class="topics">
+      <div *ngFor="let it of topicList;" [ngClass]="it.ID == ''?'topics-other':''">
+                    <span *ngIf="it.ID != ''" (click)="it.checked=(it.checked==true?false:true)"
+                          ngClass="{{it.checked==true?'topic-select':'topic-select-n'}}">{{it.MBMC}}
+                    </span>
+        <ion-item *ngIf="it.ID == ''" mode="md">
+          <ion-input #v_ytmc="ngModel" name="v_ytmc"
+                     placeholder="{{dataModel.shyktype !=4?'输入其他议题':'输入会议主题'}}"
+                     [(ngModel)]="it.MBMC">
+          </ion-input>
+        </ion-item>
+      </div>
+    </div>
+    <ion-item detail mode="md">
+      <ion-label *ngIf="dataModel.shyktype!=3">所属党支部
+        <span class="danger">*</span>
+      </ion-label>
+      <ion-label *ngIf="dataModel.shyktype==3">所属党小组
+        <span class="danger">*</span>
+      </ion-label>
+      <app-partyselect [(dzzdm)]="dataModel.partycode" [(dzzmc)]="dataModel.partyname"
+                       (dzzmcChange)="setMeetingname(dataModel.shyktype);defaultUser();"></app-partyselect>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>会议名称
+        <span class="danger">*</span>
+      </ion-label>
+      <ion-input #v_meetingname="ngModel" name="v_meetingname" id="v_meetingname"
+                 [(ngModel)]="dataModel.meetingname" placeholder="会议名称" required></ion-input>
+    </ion-item>
+    <ion-item class="item-address" detail mode="md">
+      <ion-label>会议地点
+        <span class="danger">*</span>
+      </ion-label>
+      <ion-input #v_meetingaddress="ngModel" name="v_meetingaddress" id="v_meetingaddress"
+                 [(ngModel)]="dataModel.meetingaddress" placeholder="会议地点" required></ion-input>
+      <ion-select #v_meetingaddress_select="ngModel" name="v_meetingaddress_select"
+                  id="v_meetingaddress_select"
+                  [(ngModel)]="dataModel.meetingaddress" okText="确定" cancelText="取消"
+                  interface="action-sheet">
+        <ion-select-option *ngFor="let item of historyAddressList"
+                           value="{{item.MEETINGADDRESS}}">{{item.MEETINGADDRESS}}</ion-select-option>
+      </ion-select>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>主持人
+        <span class="danger">*</span>
+      </ion-label>
+      <ion-input #v_recorduser="ngModel" name="v_recorduser" id="v_recorduser"
+                 [(ngModel)]="dataModel.chairuser" placeholder="主持人" required></ion-input>
+    </ion-item>
+    <ion-item mode="md">
+      <ion-label>记录人</ion-label>
+      <ion-input #v_chairuser="ngModel" name="v_chairuser" id="v_chairuser"
+                 [(ngModel)]="dataModel.recorduser" placeholder="请输入记录人"></ion-input>
+    </ion-item>
+    <ion-item detail mode="md">
+      <ion-label>开始时间
+        <span class="danger">*</span>
+      </ion-label>
+      <ion-datetime displayFormat="YYYY-MM-DD HH:mm" pickerFormat="YYYY MM DD" #v_begintime="ngModel"
+                    name="v_begintime"
+                    id="v_begintime"
+                    cancelText="取消" doneText="选择" placeholder="请输入开始时间"
+                    [(ngModel)]="dataModel.begintime"
+                    [pickerOptions]="begintimePickerOptions"
+                    max="{{maxDate}}"
+                    (ionChange)="meetingDateChange()"
+                    required></ion-datetime>
+    </ion-item>
+    <!--<ion-item *ngIf="isUploadFile" style="--inner-border-width: 0px 0px 0px 0px;">
+      <ion-label>会场照片</ion-label>
+    </ion-item>
+    <app-imglist *ngIf="isUploadFile" [(imgOption)]="imgOption1"></app-imglist>
+    <ion-item *ngIf="isUploadFile" style="--min-height: 1px;--inner-border-width: 0px 0px 1px 0px;--padding-start: 0px;"></ion-item>-->
+    <ion-item *ngIf="isUploadFile" style="--inner-border-width: 0px 0px 0px 0px;">
+      <ion-label>相关记录</ion-label>
+    </ion-item>
+    <app-imglist [(imgOption)]="imgOption2"></app-imglist>
+    <ion-label  style="color: red;">备注:以上可上传会议记录、现场照片,此项为选传项,仅作资料留存,不作为必传项点,也不得作为检查、考核项点。</ion-label>
+    <ion-item style="--min-height: 5px;--inner-border-width: 0px 0px 1px 0px;--padding-start: 0px;"></ion-item>
+
+    <ion-item mode="md">
+      <ion-label>参会人({{userList.length}}人)
+        <span class="danger">*</span>
+      </ion-label>
+      <ion-button (click)="selectUser()" fill="clear" size="large">
+        <ion-icon name="add-circle-outline" size="large" color="danger"></ion-icon>
+      </ion-button>
+    </ion-item>
+    <!--<div class="users">
+      <div *ngFor="let it of userList;let idx=index">
+        <ion-text>{{it.XM}}</ion-text>
+        <ion-icon name="remove-circle" color="danger" (click)="deleteUser(idx)"></ion-icon>
+      </div>
+    </div>-->
+    <!--<ion-item class="meeting-user">
+      <ion-row class="meeting-user-row" style="margin-left: 10px;margin-bottom: 10px;">
+        <ion-col size="12">
+          <ion-row class="user-item" *ngFor="let us of userList;let idx=index">
+            <ion-col size="6">{{us.XM}}</ion-col>
+            <ion-col size="3" (click)="editUserSignin(us,null)" ><span class="user-edit">{{us.SIGNINSTATUS==2?"参加":"未参加"}}</span>
+            </ion-col>
+            <ion-col size="3" (click)="deleteUser(idx)"><span class="user-edit">删除</span>
+            </ion-col>
+          </ion-row>
+        </ion-col>
+      </ion-row>
+    </ion-item>-->
+    <ion-grid>
+      <ion-row>
+        <ion-col size="4">
+          姓名
+        </ion-col>
+        <ion-col size="4">
+          状态
+        </ion-col>
+        <ion-col size="4">
+          操作
+        </ion-col>
+      </ion-row>
+      <ion-row *ngFor="let us of userList;let idx=index">
+        <ion-col size="4">
+          {{us.XM}}
+        </ion-col>
+        <ion-col size="4">
+          {{us.SIGNINSTATUS==2?"参加":"未参加"}}
+        </ion-col>
+        <ion-col size="4" class="grid-btn">
+          <span (click)="editUserSignin(us,null)">修改</span>
+          <span (click)="deleteUser(idx)">删除</span>
+        </ion-col>
+      </ion-row>
+    </ion-grid>
+    <ion-toolbar class="toolbar-center">
+      <ion-button slot="end" color="danger" mode="ios"
+                  (click)="saveMeeting(1,true)"
+                  [disabled]="!dataForm.form.valid">
+        提交
+      </ion-button>
+    </ion-toolbar>
+  </form>
+</ion-content>
+

+ 189 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/edit/edit.component.scss

@@ -0,0 +1,189 @@
+ion-content{
+  z-index: 11;
+}
+
+.meeting-type {
+  span {
+    font-size: 15px;
+    padding: 5px 5px 3px 5px;
+  }
+
+  .type-select {
+    background-color: #F0413C;
+    color: white;
+    border-radius: 3px;
+  }
+}
+
+.topics {
+  display: flex;
+  flex-wrap: wrap;
+  margin: 0 15px;
+
+  .topics-other{
+    width: 100%;
+  }
+
+  div {
+    padding: 5px 10px 7px 10px;
+
+    span {
+      font-size: 14px;
+      height: 31px;
+      padding: 5px 10px 5px 10px;
+      border-radius: 3px;
+    }
+  }
+
+  .topic-select-n {
+    background-color: #F2F2F2;
+    color: #808080;
+  }
+
+  .topic-select {
+    background-color: #F0413C;
+    color: white;
+  }
+}
+
+.users {
+  display: flex;
+  flex-wrap: wrap;
+  margin: 0 15px;
+
+  div {
+    padding: 5px 5px 7px 5px;
+
+    ion-text {
+      font-size: 14px;
+      height: 31px;
+      padding: 3px 10px 5px 10px;
+      border-radius: 3px;
+      background-color: #F2F2F2;
+      color: #808080;
+    }
+
+    ion-icon {
+      position: relative;
+      top: -5px;
+      left:-5px;
+
+    }
+
+  }
+}
+
+.btn-img{ height: 32px;width: 32px;}
+
+ion-list {
+  border-radius: 0px 0px 20px 20px;
+}
+
+.details-label, .item.sc-ion-label-md-h, .item .sc-ion-label-md-h {
+  overflow: visible;
+  color: #998989;
+}
+
+.details-text {
+  border-bottom: var(--ion-item-border-color, var(--ion-border-color, var(--ion-color-step-150, rgba(0, 0, 0, 0.13)))) 1px solid;
+  padding: 10px 0px;
+  position: relative;
+}
+
+ion-select::part(icon) {
+  display: none;
+}
+
+.item-address{
+  ion-select{
+    width: 50px;
+    position: absolute;
+    z-index: 9;
+    right: 20px;
+  }
+  ion-select::part(text) {
+    display: none;
+  }
+}
+
+app-partyselect{
+  width: 75%;
+}
+
+.meeting-user {
+  height: auto !important;
+  padding-bottom: 10px;
+  ion-label{
+    height: 100%;
+  }
+
+  .meeting-user-row {
+
+    .user-item {
+      padding-top: 2px;
+      color: #5E4545;
+
+      .user-edit {
+        background-color: #da2c36;
+        border-radius: 3px;
+        color: white;
+        font-size: 13px;
+        padding: 2px 5px;
+        height: 24px;
+        line-height: 24px;
+        width: 30px;
+      }
+    }
+  }
+
+  ion-row {
+    width: 100%;
+
+    ion-col {
+      padding: 0px 10px 0px 0px;
+    }
+  }
+
+  .xm-red {
+    color: red;
+  }
+}
+
+
+ion-grid {
+  padding: 0px;
+  color: #5E4545;
+
+  ion-row {
+    padding: 5px 12px;
+    border-bottom: 1px solid #F4F5F7;
+
+    ion-col {
+      display: -webkit-box;
+      -webkit-box-orient: horizontal;
+      -webkit-box-align: center;
+    }
+
+    ion-col:not(:first-child) {
+      -webkit-box-pack: center;
+      text-align: center;
+    }
+
+    .grid-btn{
+      color: #007EFF;
+      cursor: pointer;
+      span{
+        margin: 0 5px;
+      }
+    }
+  }
+
+  ion-row:first-child {
+    font-size: 14px;
+    color: #998989;
+  }
+
+  ion-row:not(:first-child) {
+    background-color: white;
+  }
+}

+ 445 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/edit/edit.component.ts

@@ -0,0 +1,445 @@
+import {Component, OnInit} from '@angular/core';
+import {DatePipe} from "@angular/common";
+import {ConfigService, RequsetData} from "../../../../../service/config.service";
+import {ActivatedRoute, Router} from "@angular/router";
+import {UserService} from "../../../../../service/user.service";
+import {AlertController, LoadingController, ModalController, PickerController} from "@ionic/angular";
+import {UserselectPage} from '../../../../../comm/modal/userselect/userselect.page';
+import * as moment from 'moment';
+import {WorkService} from "../../../../../service/work.service";
+import {EventService} from "../../../../../service/event.service";
+import {SHYKApi} from "../../../../../api/partylife/shyk";
+import OperateEnum from "../../../../../enum/OperateEnum";
+
+@Component({
+  selector: 'app-edit',
+  templateUrl: './edit.component.html',
+  styleUrls: ['./edit.component.scss'],
+})
+export class EditComponent implements OnInit {
+
+  //定义变量
+  op: OperateEnum = null;
+  loading: any = null;
+  userInfo: any = {};
+  selectUserUrl: string = "/appApi/home/getPartyUserList";
+
+  dataModel: any = {meetingid: ''};
+  typeList: any = [{id: 1, name: '党员大会'}, {id: 2, name: '支委会'}, {id: 3, name: '党小组会'}, {
+    id: 4,
+    name: '党课'
+  }];
+  topicList: any = [{TOPICNAME: ''}, {}];
+  userList: any = [];
+  historyAddressList: any = [];
+
+  begintimePickerOptions: any;
+  endtimePickerOptions: any;
+  beginDate: string = '';
+  begintime: string = '';
+  endDate: string = '';
+  endtime: string = '';
+  isUploadFile: boolean = false;
+  maxDate: any = moment(new Date()).add(1, 'M').format("YYYY-MM-DD");
+  imgOption1: any = {
+    fileRefid: '',
+    fileName: '',
+    fileType: 1,
+    isMulti: true,
+    readonly: false
+  };
+  imgOption2: any = {
+    fileRefid: '',
+    fileName: '',
+    fileType: 2,
+    isMulti: true,
+    readonly: false
+  };
+
+  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, public pickercontroller: PickerController, private workService: WorkService, private eventService: EventService
+    , private shykApi: SHYKApi) {
+  }
+
+  ngOnInit() {
+    this.userInfo = this.userService.GetUser();
+    this.routeInfo.queryParams.subscribe(params => {
+      this.dataModel.meetingid = params['id'];
+      this.imgOption1.fileRefid = this.dataModel.meetingid;
+      this.imgOption2.fileRefid = this.dataModel.meetingid;
+
+      this.loadData();
+    });
+
+    this.begintimePickerOptions = {
+      buttons: [{
+        text: '取消',
+        handler: () => {
+        }
+      }, {
+        text: '选择',
+        handler: (value) => {
+          this.beginDate = value.year.text + '/' + value.month.text + '/' + value.day.text;
+          this.openTimePicker(1);
+        }
+      }]
+    }
+    this.endtimePickerOptions = {
+      buttons: [{
+        text: '取消',
+        handler: () => {
+        }
+      }, {
+        text: '选择',
+        handler: (value) => {
+          this.endDate = value.year.text + '/' + value.month.text + '/' + value.day.text;
+          this.openTimePicker(2);
+        }
+      }]
+    }
+  }
+
+  //加载会议信息
+  loadData() {
+    this.shykApi.getData(this.dataModel.meetingid).subscribe((data: RequsetData) => {
+      if (data.success && data.item != null) {
+        this.dataModel = data.item;
+
+        if (this.op === OperateEnum.新增) {
+          this.dataModel.shyktype = 1;
+          this.dataModel.chairuser = this.userInfo.username;
+          this.dataModel.partycode = this.userService.GetUser().dataDzzdm.length <= 9 ? this.userInfo.DZZDM : this.userService.GetUser().dataDzzdm;
+          this.dataModel.partyname = this.userService.GetUser().dataDzzdm.length <= 9 ? this.userInfo.DZZMC : this.userService.GetUser().dataDzzmc;
+        }
+
+        this.imgOption1.fileRefid = this.dataModel.meetingid;
+        this.imgOption2.fileRefid = this.dataModel.meetingid;
+
+        this.loadTopicList();
+        this.loadUserList();
+        this.loadHistoryAddressList();
+        this.setUploadFile();
+      }
+    });
+  }
+
+  //保存会议
+  saveMeeting(shykstatus, isnotify) {
+    var topics = this.topicList.filter(it => {
+      return (it.checked == true || (it.ID == '' && it.MBMC != ''));
+    }).map(function (val) {
+      return {mbmc: val.MBMC, id: val.ID};
+    });
+
+    var users = this.userList.map(function (val) {
+      return {
+        rybm: val.RYBM,
+        xm: val.XM,
+        szdzbdm: val.SZDZBDM,
+        dzzmc: val.DZZMC,
+        signinstatus: val.SIGNINSTATUS,
+        userremark: val.USERREMARK
+      };
+    });
+
+    if (topics.length <= 0) {
+      this.presentAlert(this.dataModel.shyktype == 4 ? "请填写会议主题" : "请选择议题");
+      return false;
+    }
+    if (users.length <= 0) {
+      this.presentAlert("请选择参会人");
+      return false;
+    }
+
+    this.dataModel.begintime = new Date(this.datePipe.transform(this.dataModel.begintime, "yyyy/MM/dd HH:mm:ss"));
+    /*this.dataModel.endtime = new Date(this.datePipe.transform(this.dataModel.endtime, "yyyy/MM/dd HH:mm:ss"));
+    if (this.dataModel.begintime >= this.dataModel.endtime) {
+      this.presentAlert('开始时间必须小于结束时间');
+      return false;
+    }*/
+
+    this.presentLoading("提交中...").then(val => {
+      this.shykApi.save(this.dataModel, topics, users, this.userInfo.userid, this.userInfo.username, isnotify, shykstatus).subscribe((fdata: RequsetData) => {
+        this.loading.dismiss();
+        if (fdata.success) {
+          if (moment(this.dataModel.begintime) > moment(new Date())) {
+            this.presentAlert("会议已经提交成功!本次提交的会议为计划会议,请在会议结束后上传会议照片、台账记录、以及考勤信息内容。");
+          } else {
+            this.presentAlert(fdata.msg);
+          }
+          this.cancel();
+          this.eventService.eventEmit.emit('reloadShykList', '刷新页面');
+          this.workService.getWorkSettingList();
+        } else {
+          this.presentAlert(fdata.msg);
+        }
+      });
+    });
+  }
+
+  //会议类型变更
+  changeType() {
+    this.setMeetingname(this.dataModel.shyktype);
+    //this.setUserUrl();
+    this.loadTopicList();
+    this.defaultUser();
+  }
+
+  //会议名称
+  setMeetingname(typeId) {
+    //会议名称默认值【类型】部门[日期]
+
+    let meetingDate = this.dataModel.begintime || new Date();
+
+    this.dataModel.meetingname = "【" + this.typeList.filter(it => it.id == typeId)[0].name + "】" +
+      this.dataModel.partyname + "[" + this.datePipe.transform(meetingDate, 'yyyyMM') + "]";
+  }
+
+  setUploadFile() {
+    this.isUploadFile = this.dataModel.begintime != null && moment(this.dataModel.begintime) <= moment(new Date());
+  };
+
+  meetingDateChange() {
+    this.setMeetingname(this.dataModel.shyktype);
+    this.setUploadFile();
+  };
+
+  //加载题议
+  loadTopicList() {
+    this.shykApi.getTopicList(this.dataModel.meetingid, this.dataModel.shyktype).subscribe((data: RequsetData) => {
+      if (data.success) {
+        if (data.item != null) {
+          this.topicList = data.item;
+          this.topicList.forEach((it) => {
+            if (it.MEETINGTOPICID != null && it.MEETINGTOPICID != "") {
+              it.checked = true;
+            }
+          });
+        }
+      }
+    });
+  }
+
+  //加载人员
+  loadUserList() {
+    this.shykApi.getMeetingUserList(this.dataModel.meetingid).subscribe((data: RequsetData) => {
+      if (data.success) {
+        if (data.item != null) {
+          this.userList = data.item.list;
+        }
+      }
+
+      if (this.userList.length <= 0) {
+        this.defaultUser();
+      }
+    });
+
+  }
+
+  //初始化参会成员
+  defaultUser() {
+    this.userList = [];
+    var dzzdm = this.dataModel.partycode;
+    var szdzbdm = '';
+    var getUserUrl = this.selectUserUrl;
+    if (this.dataModel.shyktype == 2) {
+      szdzbdm = this.dataModel.partycode;
+      getUserUrl = "/appApi/home/getLeaderUserList";//支委领导成员
+    }
+
+    this.configService.HttpGetRomote(getUserUrl, {
+      pageindex: 1,
+      pagesize: 10000,
+      szdzbdm: szdzbdm,
+      dzzdm: dzzdm
+    }).subscribe((data: RequsetData) => {
+      if (data.success) {
+        if (data.item != null) {
+          this.userList = data.item.list;
+          this.userList.forEach(item => {
+            item.SIGNINSTATUS = 2;
+          });
+        }
+      }
+    });
+  }
+
+  //删除参会成员
+  deleteUser(idx) {
+    this.userList.splice(idx, 1);
+  }
+
+  //选择参会成员
+  selectUser() {
+    this.presentModal();
+  }
+
+  loadHistoryAddressList() {
+    this.shykApi.getHistoryAddressList(this.userInfo.userid).subscribe((data: RequsetData) => {
+      if (data.success) {
+        if (data.item != null) {
+          this.historyAddressList = data.item;
+          if (this.historyAddressList.length > 0 && this.dataModel.meetingaddress == "" || this.dataModel.meetingaddress == null) {
+            this.dataModel.meetingaddress = this.historyAddressList[0].MEETINGADDRESS;
+          }
+        }
+      }
+    });
+  }
+
+  //取消
+  cancel() {
+    this.router.navigate(['../shykindex'], {relativeTo: this.routeInfo});
+  }
+
+  async presentLoading(msg: string) {
+    this.loading = await this.loadingController.create({
+      message: msg,
+      spinner: 'circles'
+    });
+    return this.loading.present();
+  }
+
+  async presentAlert(msg: string) {
+    const alert = await this.alertController.create({
+      header: '提示',
+      subHeader: '',
+      message: msg,
+      buttons: ['确定']
+    });
+
+    await alert.present();
+  }
+
+  //人员选择控件
+  async presentModal() {
+    var removeUsers = this.userList.map(it => it.RYBM).join(',');
+    var szdzbdm = this.dataModel.shyktype == 2 ? this.userInfo.DZZDM : '';
+
+    const modal = await this.modalController.create({
+      component: UserselectPage,
+      componentProps: {
+        'pageindex': 1,
+        'pagesize': 30,
+        'dzzdm': this.dataModel.partycode,
+        'removeUsers': removeUsers,
+        'xm': '',
+        'getUserUrl': this.selectUserUrl,
+        'szdzbdm': szdzbdm
+      }
+    });
+
+    await modal.present();
+
+    const {data} = await modal.onWillDismiss();
+    if (data.rtnData != null && data.rtnData.length > 0) {
+      var us = data.rtnData;
+
+      for (var i = 0; i < us.length; i++) {
+        if (this.userList.filter(it => {
+          return it.RYBM == us[i].rybm
+        }).length <= 0) {
+          this.userList.push({
+            RYJBXXBS: us[i].ryjbxxbs, RYBM: us[i].rybm, XM: us[i].xm,
+            SZDZBDM: us[i].szdzbdm,
+            DZZMC: us[i].szdzzmc,
+            SIGNINSTATUS: 2
+          });
+        }
+      }
+
+    }
+  }
+
+  async openTimePicker(type) {
+    const picker = await this.pickercontroller.create({
+      columns: this.getTimeColumns(),
+      cssClass: 'my-picker-time',
+      buttons: [
+        {
+          text: '取消',
+          role: 'cancel'
+        },
+        {
+          text: '选择',
+          handler: (value) => {
+            var time = value.hours.text + ':' + value.minutes.text + ':00';
+            if (type == 1) {
+              this.begintime = time;
+              this.dataModel.begintime = this.beginDate + ' ' + this.begintime;
+            } else {
+              this.endtime = time;
+              this.dataModel.endtime = this.endDate + ' ' + this.endtime;
+            }
+          }
+        }
+      ]
+    });
+    await picker.present();
+  }
+
+  getTimeColumns() {
+    let columns = [];
+    columns.push({
+      name: `hours`,
+      options: this.getTimeColumnOptions(0, 24, 1)
+    });
+    columns.push({
+      name: `minutes`,
+      options: this.getTimeColumnOptions(0, 60, 5)
+    })
+    ;
+    return columns;
+  }
+
+  getTimeColumnOptions(min, max, step) {
+    let options = [];
+    for (let i = min; i < max; i = i + step) {
+      var text = i.toString().length <= 1 ? "0" + i.toString() : i.toString();
+      options.push({
+        text: text,
+        value: text
+      })
+    }
+    return options;
+  }
+
+  editUserSignin(user, state) {
+    this.presentAlertUserSignin(user);
+  }
+
+  async presentAlertUserSignin(user) {
+    const alert = await this.alertController.create({
+      header: user.XM,
+      inputs: [
+        {
+          name: 'userremark',
+          type: 'text',
+          placeholder: '请输入未参加原因',
+          value: user.USERREMARK
+        }
+      ],
+      buttons: [{
+        text: '未参加',
+        handler: (result) => {
+          if (result.userremark == "" || result.userremark == null) {
+            this.presentAlert("请填写未参加原因");
+            return false;
+          }
+          user.SIGNINSTATUS = 3;
+          user.USERREMARK = result.userremark;
+        }
+      }, {
+        text: '参加',
+        handler: (result) => {
+          user.SIGNINSTATUS = 2;
+          user.USERREMARK = "";
+        }
+      }]
+    });
+
+    await alert.present();
+  }
+
+
+}

+ 115 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/record/record.component.html

@@ -0,0 +1,115 @@
+<ion-header class="header-theme2">
+  <ion-toolbar>
+    <ion-label class="title-center">录入会议记录</ion-label>
+    <ion-buttons slot="start">
+      <ion-back-button icon="ios-back2" text="" mode="md"></ion-back-button>
+    </ion-buttons>
+  </ion-toolbar>
+</ion-header>
+<ion-content>
+  <form #upImgForm="ngForm" class="form-table">
+    <ion-item>
+      {{dataModel.meetingname}}
+    </ion-item>
+    <ion-item>
+      <ion-label>会议类别</ion-label>
+      <ion-text>{{shykTypeName}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>会议时间</ion-label>
+      <ion-text style="white-space:normal;">
+        <span>{{dataModel.begintime|date:'yyyy-MM-dd HH:mm'}}</span> -
+        <span
+          *ngIf="(dataModel.begintime|date:'yyyyMMdd')==(dataModel.endtime|date:'yyyyMMdd')">{{dataModel.endtime|date:'HH:mm'}}</span>
+        <span
+          *ngIf="(dataModel.begintime|date:'yyyyMMdd')!=(dataModel.endtime|date:'yyyyMMdd')">{{dataModel.endtime|date:'yyyy-MM-dd HH:mm'}}</span>
+      </ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>所属组织</ion-label>
+      <ion-text>{{dataModel.partyname}}</ion-text>
+    </ion-item>
+    <ion-item style="--inner-border-width: 0px 0px 0px 0px;">
+      <ion-label *ngIf="dataModel.shyktype !=4">会议议题
+      </ion-label>
+      <ion-label *ngIf="dataModel.shyktype ==4">会议主题
+      </ion-label>
+    </ion-item>
+    <ion-item class="meeting-yiti">
+      <ion-text>
+        <div *ngFor="let it of topicList;let first=first;let index=index;"
+             ngClass="{{first?'':'meeting-yiti-item'}}" (click)="showTopic(it.MODELID)">
+          <span>{{index + 1}}、{{it.TOPICNAME}}</span>
+          <img *ngIf="it.MODELID!=null && it.MODELID!=''" class="meeting-yiti-showimg"
+               src="assets/icon/showlist.svg"/>
+          <br>
+        </div>
+      </ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>会议地点</ion-label>
+      <ion-text>{{dataModel.meetingaddress}}</ion-text>
+    </ion-item>
+    <ion-item>
+      <ion-label>主持人</ion-label>
+      <ion-text>{{dataModel.chairuser}}</ion-text>
+      <ion-label class="meeting-recorduser">记录人</ion-label>
+      <ion-text>{{dataModel.recorduser}}</ion-text>
+    </ion-item>
+    <ion-item style="--inner-border-width: 0px 0px 0px 0px;">
+      <ion-label>参与人</ion-label>
+    </ion-item>
+    <ion-item class="meeting-user">
+      <ion-row class="meeting-user-row" style="margin-left: 10px;margin-bottom: 10px;">
+        <ion-col size="12">
+          <ion-row class="user-item" *ngFor="let us of userList;let last = last">
+            <ion-col size="3">{{us.USERNAME}}</ion-col>
+            <ion-col size="4" (click)="editUserSignin(us)"><span
+              [ngClass]="isEditUser?'user-edit':''">{{us.SIGNINSTATUSNAME}}</span></ion-col>
+            <ion-col size="4" (click)="editUserCheckin(us)"><span
+              [ngClass]="isEditUser?'user-edit':''">{{us.CHECKINSTATUSNAME}}</span></ion-col>
+          </ion-row>
+        </ion-col>
+      </ion-row>
+    </ion-item>
+    <ion-item *ngIf="dataModel.createuserid==userInfo.userid">
+      <ion-grid>
+        <ion-row *ngIf="difftime > 0">
+          <ion-col>
+            <ion-text>
+              <span>会议人员:{{userList.length}}人,</span>
+              <span>确认参加:{{(userList | myfilter:'SIGNINSTATUS':'2').length }}人,</span>
+              <span>未参加:{{(userList | myfilter:'SIGNINSTATUS':'3').length }}人</span>
+            </ion-text>
+          </ion-col>
+        </ion-row>
+        <ion-row *ngIf="difftime <= 0">
+          <ion-col>
+            <ion-text>
+              <span>应到人数:{{userList.length}}人,</span>
+              <span>实到人数:{{(userList | myfilter:'CHECKINSTATUS':'1').length }}人,</span>
+              <span>缺席人数:{{(userList | myfilter:'CHECKINSTATUS':'0').length }}人</span>
+            </ion-text>
+          </ion-col>
+        </ion-row>
+      </ion-grid>
+    </ion-item>
+    <!-- <ion-item style="--inner-border-width: 0px 0px 0px 0px;">
+      <ion-label>会场照片</ion-label>
+    </ion-item>
+    <app-imglist [(imgOption)]="imgOption1"></app-imglist>
+    <ion-item style="--min-height: 1px;"></ion-item>-->
+    <ion-item style="--inner-border-width: 0px 0px 0px 0px;">
+      <ion-label>相关记录</ion-label>
+    </ion-item>
+    <app-imglist [(imgOption)]="imgOption2"></app-imglist>
+  </form>
+</ion-content>
+<ion-footer>
+  <ion-toolbar class="toolbar-center">
+    <ion-button slot="end" color="danger" mode="ios"
+                (click)="saveImg(1)">
+      提交
+    </ion-button>
+  </ion-toolbar>
+</ion-footer>

+ 127 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/record/record.component.scss

@@ -0,0 +1,127 @@
+ion-content{
+  z-index: 11;
+}
+
+ion-item {
+  --inner-border-width: 0px 0px 1px 0px;
+  margin-right: 10px;
+}
+
+.meeting-yiti {
+  height: auto !important;
+  margin: 5px 0px;
+  ion-label{
+    height: 100%;
+  }
+  ion-text {
+    margin: 2px 0 10px 10px;
+    .meeting-yiti-item {
+      padding-top: 5px;
+    }
+
+    .meeting-yiti-showimg {
+      height: 16px;
+      width: 16px;
+      vertical-align: middle;
+      padding-bottom: 2px;
+    }
+  }
+}
+
+.meeting-recorduser {
+  margin-left: 30px;
+}
+
+.meeting-user {
+  height: auto !important;
+  padding-bottom: 10px;
+  ion-label{
+    height: 100%;
+  }
+
+  .meeting-user-row {
+
+    .user-item {
+      padding-top: 2px;
+      color: #5E4545;
+
+      .user-edit {
+        background-color: #da2c36;
+        border-radius: 3px;
+        color: white;
+        font-size: 13px;
+        padding: 2px 5px;
+        height: 24px;
+        line-height: 24px;
+        width: 30px;
+      }
+    }
+  }
+
+  ion-row {
+    width: 100%;
+
+    ion-col {
+      padding: 0px 10px 0px 0px;
+    }
+  }
+
+  .xm-red {
+    color: red;
+  }
+}
+
+.meeting-user-study {
+  ion-item-divider {
+    border: none;
+    position: relative;
+
+    ion-label {
+      position: absolute;
+      top: 0px;
+      margin-top: 8px;
+    }
+
+    ion-textarea {
+      padding-left: 100px;
+    }
+  }
+
+}
+
+.meeting-imgs {
+  ion-item-divider {
+    border: none;
+  }
+
+  .img-list {
+    display: flex;
+    text-align: center;
+    flex-direction: row;
+    flex-wrap: wrap;
+    padding: 0 10px 10px 10px;
+
+    .img-item {
+      width: 25%;
+      position: relative;
+
+      img {
+        padding: 3px 5px;
+        height: 80px;
+        object-fit: cover;
+      }
+
+      .remove-icon {
+        position: absolute;
+        right: -3px;
+        top: -3px;
+      }
+
+      ion-button {
+        --box-shadow: 0px;
+        height: 73px;
+        width: 75px;
+      }
+    }
+  }
+}

+ 464 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/record/record.component.ts

@@ -0,0 +1,464 @@
+import {Component, OnInit} from '@angular/core';
+import {ActivatedRoute, Router} from "@angular/router";
+import {ConfigService, RequsetData} from "../../../../../service/config.service";
+import {UserService} from "../../../../../service/user.service";
+import {ActionSheetController, AlertController, LoadingController} from "@ionic/angular";
+import {ImgFileModel, JsBridgeService} from "../../../../../service/js-bridge.service";
+import {DatePipe} from "@angular/common";
+import {interval} from 'rxjs';
+import {BaseComponent} from "../../../../../comm/base.component";
+import {takeUntil} from "rxjs/operators";
+
+@Component({
+  selector: 'app-record',
+  templateUrl: './record.component.html',
+  styleUrls: ['./record.component.scss'],
+})
+export class RecordComponent extends BaseComponent {
+
+  secondsCounter = interval(10000);//定时器刷新成员签到状态(10秒)
+
+  loading: any = null;
+  userInfo: any = {};//当前用户信息
+
+  webServerHost: string = '';
+
+  getDataUrl: string = '/appApi/shyk/getMeetingById';//获取会议信息url
+  getTopicUrl: string = '/appApi/shyk/getMeetingTopicList';//获取议题url
+  getUserUrl: string = '/appApi/shyk/getMeetingUserList';//获取参会成员url
+
+  saveSigninUrl: string = '/appApi/shyk/signinMeeting';//保存签收信息
+  saveCheckinUrl: string = '/appApi/shyk/checkinMeeting';//保存签到信息
+  clearMessageUrl: string = '/appApi/message/clearMessageByBusinessId';
+  saveImgUrl: string = '/appApi/shyk/saveMeetingImg';
+  cancelUserSigninUrl: string = '/appApi/shyk/cancelUserSignin';//取消签收信息
+  cancelUserCheckinUrl: string = '/appApi/shyk/cancelUserCheckin';//取消签到信息
+
+  meetingId: string = '';
+  dataModel: any = {};//会议信息
+  topicList: any = [];//议题
+  userList: any = [];//参会成员
+  meetingUserModel: any = {};//当前登录人会议信息
+  shykTypeName: string = '';//会议类型
+
+  difftime: any = 0;//会议时间与当前时间差(分钟)
+  isEdit: any = true;//是否可编辑(会议状态,已取消的会议不可编辑)
+  isEditUser: any = false;//是否可操作成员签到
+
+  imgOption1: any = {
+    fileRefid: '',
+    fileName: '',
+    fileType: 1,
+    isMulti: true,
+    readonly: false
+  };
+
+  imgOption2: any = {
+    fileRefid: '',
+    fileName: '',
+    fileType: 2,
+    isMulti: true,
+    readonly: false
+  };
+
+  constructor(private router: Router, private routeInfo: ActivatedRoute, private configService: ConfigService, private userService: UserService, public alertController: AlertController,
+              public loadingController: LoadingController, private jsBridgeService: JsBridgeService, private datePipe: DatePipe) {
+    super();
+  }
+
+  ngOnInit() {
+    this.userInfo = this.userService.GetUser();
+    this.configService.GetConfig().subscribe((config) => {
+      this.webServerHost = config.webServerHost;
+    });
+    this.routeInfo.queryParams.subscribe(params => {
+      this.meetingId = params['id'];
+      this.imgOption1.fileRefid = this.meetingId;
+      this.imgOption2.fileRefid = this.meetingId;
+      this.loadData();
+    });
+
+    this.secondsCounter.pipe(takeUntil(this.$destory)).subscribe(data => {
+      this.loadUserList();
+    });
+  }
+
+  loadData() {
+    this.configService.HttpGetRomote(this.getDataUrl, {
+      id: this.meetingId,
+      userId: this.userInfo.userid,
+      userName: this.userInfo.username
+    }).subscribe((data: RequsetData) => {
+      if (data.success) {
+        if (data.item != null) {
+          this.dataModel = data.item;
+          if (data.extdata.meetingUser != null) {
+            this.meetingUserModel = data.extdata.meetingUser;
+          }
+          this.shykTypeName = data.extdata.shykTypeName;
+          this.difftime = data.extdata.difftime;
+
+          this.imgOption1.fileName = this.dataModel.meetingname;
+          this.imgOption2.fileName = this.dataModel.meetingname;
+
+          this.setPermiss();
+          this.loadUserList();
+          this.loadTopicList();
+        }
+      }
+    });
+  }
+
+  //操作权限设置
+  setPermiss() {
+    this.isEdit = this.dataModel.shykstatus == 1;//会议状态,1已下发,2已取消
+
+    //会议开始后可以在后台协助签到,录入会议记录后不允许签到
+    this.isEditUser = this.difftime <= 0
+      //&& this.dataModel.meetingrecordstate != 1
+      && this.dataModel.createuserid == this.userInfo.userid
+      && this.dataModel.shykstatus != 0;
+  }
+
+  loadUserList() {
+    this.configService.HttpGetRomote(this.getUserUrl, {
+      pageindex: 1,
+      pagesize: 10000,
+      meetingId: this.meetingId,
+    }).subscribe((data: RequsetData) => {
+      if (data.success) {
+        if (data.item != null) {
+          this.userList = data.item.list;
+        }
+      }
+    });
+  }
+
+  loadTopicList() {
+    this.configService.HttpGetRomote(this.getTopicUrl, {
+      meetingId: this.meetingId,
+    }).subscribe((data: RequsetData) => {
+      if (data.success) {
+        if (data.item != null) {
+          this.topicList = data.item;
+        }
+      }
+    });
+  }
+
+  //签收
+  signin(isback, userId, isSignin, userremark) {
+    this.presentAlertConfirm(isSignin ? "确认参加?" : "确认请假?", () => {
+      this.presentLoading("提交中...").then(val => {
+        this.configService.HttpPostRomote(this.saveSigninUrl, {
+          meetingId: this.dataModel.meetingid,
+          userCode: userId,
+          isSignin: isSignin,
+          userId: this.userInfo.userid,
+          userName: this.userInfo.username,
+          userRemark: !isSignin ? userremark : ""
+        }).subscribe((fdata: RequsetData) => {
+          this.loading.dismiss();
+          if (fdata.success) {
+            if (isback) {
+              this.backPage();
+            } else {
+              this.loadUserList();
+            }
+          }
+          this.presentAlert(fdata.msg);
+        });
+      });
+    });
+  }
+
+  //签到
+  checkin(isback, userId: string) {
+    //验证成功进行签到
+    this.presentLoading("签到中...").then(val => {
+      this.configService.HttpPostRomote(this.saveCheckinUrl, {
+        meetingId: this.dataModel.meetingid,
+        userCode: userId,
+        userId: this.userInfo.userid,
+        userName: this.userInfo.username
+      }).subscribe((fdata: RequsetData) => {
+        this.loading.dismiss();
+        if (fdata.success) {
+          if (isback) {
+            this.backPage();
+          } else {
+            this.loadUserList();
+          }
+        }
+        this.presentAlert(fdata.msg);
+      });
+    });
+  }
+
+  //二维码签到
+  scanQRCode() {
+    this.jsBridgeService.ScanQRCode().subscribe(req => {
+      if (req.success == false) {
+        this.presentAlert(req.error);
+        return false;
+      }
+      if (req.data.qrcode != this.dataModel.meetingid) {
+        this.presentAlert("会议二维码不匹配!");
+        return false;
+      }
+
+      let endTime = new Date(this.datePipe.transform(this.dataModel.endtime, "yyyy/MM/dd HH:mm:ss"));
+
+      if (new Date() > endTime) {
+        this.presentAlert("请在会议结束前进行签到!");
+        return false;
+      }
+
+      //验证成功进行签到
+      this.checkin(true, this.userInfo.userid);
+    });
+  }
+
+
+  //清除通知
+  clearMessage(userId: string, messageType) {
+    this.configService.HttpGetRomote(this.clearMessageUrl, {
+      businessId: this.dataModel.meetingid,
+      userId: userId,
+      messageType: messageType
+    }).subscribe((fdata: RequsetData) => {
+
+    });
+  }
+
+  //管理员操作人员签收
+  editUserSignin(user) {
+    if (user.SIGNINSTATUS == 1 && this.isEditUser) {
+      this.presentAlertUserSignin(user);//签收
+    }
+
+    if ((user.SIGNINSTATUS == 2 || user.SIGNINSTATUS == 3) && this.isEditUser) {
+      this.presentAlertUserSignin_Cancel(user);//取消签收
+    }
+  }
+
+  //管理员操作人员签到
+  editUserCheckin(user) {
+    if (user.CHECKINSTATUS == 0 && this.isEditUser) {
+      this.presentAlertUserCheckin(user);//签到
+    }
+
+    if (user.CHECKINSTATUS == 1 && this.isEditUser) {
+      this.presentAlertUserCheckin_Cancel(user);//取消签到
+    }
+  }
+
+  //保存会议图片
+  saveImg(state) {
+    this.presentAlertConfirm(state == 0 ? "确认保存?" : "确认提交?", () => {
+      this.presentLoading(state == 0 ? "保存中..." : "提交中...").then(val => {
+        this.configService.HttpPostRomote(this.saveImgUrl, {
+          meetingId: this.dataModel.meetingid,
+          userId: this.userInfo.userid,
+          userName: this.userInfo.username,
+          state: state
+        }).subscribe((fdata: RequsetData) => {
+          this.loading.dismiss();
+          if (fdata.success) {
+            this.backPage();
+          }
+          this.presentAlert(fdata.msg);
+        });
+      });
+    });
+  }
+
+  async presentLoading(msg: string) {
+    this.loading = await this.loadingController.create({
+      message: msg,
+      spinner: 'circles'
+    });
+    return this.loading.present();
+  }
+
+  async presentAlert(msg: string) {
+    const alert = await this.alertController.create({
+      header: '提示',
+      subHeader: '',
+      message: msg,
+      buttons: ['确定']
+    });
+
+    await alert.present();
+  }
+
+  async presentAlertConfirm(msg: string, handler) {
+    const alert = await this.alertController.create({
+      header: '提示',
+      message: '<strong>' + msg + '</strong>',
+      buttons: [
+        {
+          text: '关闭',
+          role: 'cancel',
+          cssClass: 'secondary',
+          handler: () => {
+
+          }
+        }, {
+          text: '确定',
+          handler: handler
+        }
+      ]
+    });
+
+    await alert.present();
+  }
+
+  async presentAlertUserSignin(user) {
+    const alert = await this.alertController.create({
+      header: user.USERNAME,
+      inputs: [
+        {
+          name: 'userremark',
+          type: 'text',
+          placeholder: '请输入未参加原因',
+          value: user.USERREMARK
+        }
+      ],
+      buttons: [{
+        text: '未参加',
+        handler: (result) => {
+          if (result.userremark == "" || result.userremark == null) {
+            this.presentAlert("请填写未参加原因");
+            return false;
+          }
+          this.signin(false, user.USERCODE, false, result.userremark);
+
+          this.clearMessage(user.USERCODE, 1);
+        }
+      }, {
+        text: '参加',
+        handler: (result) => {
+          this.signin(false, user.USERCODE, true, "");
+
+          this.clearMessage(user.USERCODE, 1);
+        }
+      }]
+    });
+
+    await alert.present();
+  }
+
+  async presentAlertUserCheckin(user) {
+    const alert = await this.alertController.create({
+      header: user.USERNAME,
+      buttons: [{
+        text: '关闭',
+        role: 'cancel',
+        cssClass: 'secondary',
+        handler: () => {
+
+        }
+      },{
+        text: '签到',
+        handler: (result) => {
+          this.checkin(false, user.USERCODE);
+
+          this.clearMessage(user.USERCODE, 1);
+        }
+      }]
+    });
+
+    await alert.present();
+  }
+
+
+  async presentAlertUserSignin_Cancel(user) {
+    const alert = await this.alertController.create({
+      header: user.USERNAME,
+      message: "取消会议签收?",
+      buttons: [{
+        text: '关闭',
+        role: 'cancel',
+        cssClass: 'secondary',
+        handler: () => {
+
+        }
+      },{
+        text: '确认',
+        handler: (result) => {
+          this.presentLoading("取消中...").then(val => {
+            this.configService.HttpPostRomote(this.cancelUserSigninUrl, {
+              meetingId: this.dataModel.meetingid,
+              userCode: user.USERCODE,
+              userId: this.userInfo.userid,
+              userName: this.userInfo.username
+            }).subscribe((fdata: RequsetData) => {
+              this.loading.dismiss();
+              if (fdata.success) {
+                this.loadUserList();
+              }
+              this.presentAlert(fdata.msg);
+            });
+          });
+        }
+      }]
+    });
+
+    await alert.present();
+  }
+
+  async presentAlertUserCheckin_Cancel(user) {
+    const alert = await this.alertController.create({
+      header: user.USERNAME,
+      message: "取消签到?",
+      buttons: [{
+        text: '关闭',
+        role: 'cancel',
+        cssClass: 'secondary',
+        handler: () => {
+
+        }
+      },{
+        text: '确认',
+        handler: (result) => {
+          this.presentLoading("取消中...").then(val => {
+            this.configService.HttpPostRomote(this.cancelUserCheckinUrl, {
+              meetingId: this.dataModel.meetingid,
+              userCode: user.USERCODE,
+              userId: this.userInfo.userid,
+              userName: this.userInfo.username
+            }).subscribe((fdata: RequsetData) => {
+              this.loading.dismiss();
+              if (fdata.success) {
+                this.loadUserList();
+              }
+              this.presentAlert(fdata.msg);
+            });
+          });
+        }
+      }]
+    });
+
+    await alert.present();
+  }
+
+  //跳转页面
+  backPage() {
+    //this.router.navigate(['/main/tabs/tab1/shykindex'], {queryParams: {random: Math.random()}});
+
+    //this.router.navigate(['/main/tabs/tab1/shykindex', {random: Math.random()}]);
+    this.router.navigate(['../shykindex'], {relativeTo: this.routeInfo});
+  }
+
+  showTopic(id) {
+    if (id != null && id != '') {
+      //this.router.navigate(['/main/tabs/tab1/shykshowtopic'], {queryParams: {id: id, random: Math.random()}});
+      this.router.navigate(['../shykshowtopic'], {
+        relativeTo: this.routeInfo,
+        queryParams: {id: id, random: Math.random()}
+      });
+    }
+  }
+
+}

+ 12 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/showtopic/showtopic.component.html

@@ -0,0 +1,12 @@
+<ion-header class="header-theme2">
+  <ion-toolbar>
+    <ion-label class="title-center">议题详情</ion-label>
+    <ion-buttons slot="start">
+      <ion-back-button icon="ios-back2" text="" mode="md"></ion-back-button>
+    </ion-buttons>
+  </ion-toolbar>
+</ion-header>
+<ion-content>
+    <div class="mb-title"><h5>{{dataModel.mbmc}}</h5></div>
+    <div class="mb-content" [innerHTML]="dataModel.mbnr"></div>
+</ion-content>

+ 7 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/showtopic/showtopic.component.scss

@@ -0,0 +1,7 @@
+.mb-title{
+  text-align: center;
+}
+.mb-content {
+  padding-left: 10px;
+  padding-right: 10px;
+}

+ 38 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/showtopic/showtopic.component.ts

@@ -0,0 +1,38 @@
+import {Component, OnInit} from '@angular/core';
+import {ActivatedRoute, Router} from "@angular/router";
+import {ConfigService, RequsetData} from "../../../../../service/config.service";
+
+@Component({
+    selector: 'app-showtopic',
+    templateUrl: './showtopic.component.html',
+    styleUrls: ['./showtopic.component.scss'],
+})
+export class ShowtopicComponent implements OnInit {
+
+    modelId: string = '';
+    dataModel: any = {};
+    getDataUrl: string = '/appApi/shyk/getTopicModelById';
+
+    constructor(private router: Router, private route: ActivatedRoute, private configService: ConfigService) {
+    }
+
+    ngOnInit() {
+        this.route.queryParams.subscribe(params => {
+            this.modelId = params['id'];
+            this.loadData();
+        });
+    }
+
+    loadData() {
+        this.configService.HttpGetRomote(this.getDataUrl, {
+            id: this.modelId
+        }).subscribe((data: RequsetData) => {
+            if (data.success) {
+                if (data.item != null) {
+                    this.dataModel = data.item;
+                }
+            }
+        });
+    }
+
+}

+ 74 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/shyk.component.html

@@ -0,0 +1,74 @@
+<ion-header>
+  <ion-toolbar>
+    <ion-label>三会一课</ion-label>
+    <ion-buttons slot="start">
+      <ion-back-button icon="ios-back" 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" [(dzzmc)]="searchParams.dzzmc" (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 class="border-item" [routerLink]="['../shykdetail']"
+                [queryParams]="{id: item.MEETINGID}">
+        <ion-label text-wrap>
+          <ion-row>
+            <ion-col>
+              {{item.PARTYNAME}}
+            </ion-col>
+          </ion-row>
+          <ion-row class="item-subtitle">
+            <ion-label class="item-subtitle-type">
+              {{item.SHYKTYPENAME}}
+            </ion-label>
+            <ion-label *ngIf="item.PARTYCODE.length>12" style="white-space: normal;">
+              {{item.DWMC}}
+            </ion-label>
+            <ion-label>
+              <span class="text-month">   {{item.BEGINTIME | date:'yyyy-MM-dd HH:mm'}}</span>
+            </ion-label>
+          </ion-row>
+        </ion-label>
+      </ion-item>
+
+      <ion-item-options side="end">
+        <ion-item-option (click)="delete(item.MEETINGID)">删除</ion-item-option>
+      </ion-item-options>
+    </ion-item-sliding>
+  </ion-list>
+  <app-empty *ngIf="dataList.length===0"></app-empty>
+  <ion-infinite-scroll threshold="100px" (ionInfinite)="scroll($event)">
+    <ion-infinite-scroll-content
+      loadingSpinner="bubbles"
+      loadingText="{{total>searchParams.pageIndex*searchParams.pageSize?'正在加载...':'暂无更多'}}">
+    </ion-infinite-scroll-content>
+  </ion-infinite-scroll>
+  <!--<ion-fab btn-permission btnNo="shyk.add" style="display: none;"
+           vertical="bottom" horizontal="center" slot="fixed" class="fab-add">
+    <ion-fab-button>
+      <ion-text class="btn-add" (click)="addmeeting()">
+        <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-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>
+
+

+ 126 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/shyk.component.scss

@@ -0,0 +1,126 @@
+.addmeeting {
+  padding-right: 50px;
+}
+
+.tabs {
+  top: 56px;
+
+  .tab-line {
+    width: 45px;
+    height: 2px;
+    background-color: red;
+    bottom: 0px;
+    position: absolute;
+    float: bottom;
+  }
+
+
+
+  ion-tab-button {
+    font-size: 14px;
+  }
+}
+
+.text-month{
+  color: #998989;
+  font-size: 12px;
+  border-radius: 4px;
+  background-color: #F3F3F3;
+  padding: 0px 4px;
+  margin-left: 20px;
+}
+
+ion-label {
+  margin: 3px !important;
+  padding: 0px;
+}
+
+.item-subtitle {
+  .item-subtitle-type {
+    border: 1px solid #da2c36;
+    color: #da2c36;
+    background-color: white;
+    border-radius: 3px;
+    padding: 1px 5px 0px 5px;
+  }
+
+  .item-subtitle-state {
+    border: 1px solid #fe8b24;
+    color: white;
+    background-color: #fe8b24;
+    border-radius: 3px;
+    padding: 1px 5px 0px 5px;
+  }
+
+  ion-label {
+    color: #737373;
+    font-size: 14px;
+    display: flex;
+    justify-content: center;
+    align-items: Center;
+    padding-right: 8px;
+  }
+
+  ion-button {
+    position: absolute;
+    right: 10px;
+    bottom: 2px;
+    --padding-start: 5px;
+    --padding-end: 5px;
+  }
+}
+
+
+.tab-select {
+  color: #da2c36;
+  //border-bottom: 2px solid #da2c36;
+}
+
+/*
+.ui-box {
+  text-decoration:none;
+  border:none;
+  position:relative;
+  vertical-align:baseline;
+}
+.tab-select:before,
+.tab-select:after,
+.tab-select>.ui-border-element:before,
+.tab-select>.ui-border-element:after {
+  content:'';
+  position:absolute
+}
+.tab-select:after {
+  border-bottom:2px solid red;
+  left:51%;
+  right:51%;
+  bottom:0px;
+  -webkit-transition-property:all;
+  -moz-transition-property:all;
+  -o-transition-property:all;
+  transition-property:all;
+  -webkit-transition-timing-function:cubic-bezier(0, 0.98, 0.51, 0.93);
+  -moz-transition-timing-function:cubic-bezier(0, 0.98, 0.51, 0.93);
+  -o-transition-timing-function:cubic-bezier(0, 0.98, 0.51, 0.93);
+  transition-timing-function:cubic-bezier(0, 0.98, 0.51, 0.93);
+  -webkit-transition-duration:200ms;
+  -moz-transition-duration:200ms;
+  -o-transition-duration:200ms;
+  transition-duration:200ms;
+  -webkit-transition-delay:0s;
+  -moz-transition-delay:0s;
+  -o-transition-delay:0s;
+  transition-delay:0s
+}
+.tab-select:hover:after {
+  left:20%;
+  right:20%
+}
+.tab-select:not(:hover):after {
+  -webkit-transition-delay:0s;
+  -moz-transition-delay:0s;
+  -o-transition-delay:0s;
+  transition-delay:0s
+}*/
+
+

+ 27 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/shyk.component.spec.ts

@@ -0,0 +1,27 @@
+import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ShykComponent } from './shyk.component';
+
+describe('ShykComponent', () => {
+  let component: ShykComponent;
+  let fixture: ComponentFixture<ShykComponent>;
+
+  beforeEach(async(() => {
+    TestBed.configureTestingModule({
+      declarations: [ ShykComponent ],
+      schemas: [CUSTOM_ELEMENTS_SCHEMA],
+    })
+    .compileComponents();
+  }));
+
+  beforeEach(() => {
+    fixture = TestBed.createComponent(ShykComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 228 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/shyk.component.ts

@@ -0,0 +1,228 @@
+import {Component, OnInit, ViewChild} from '@angular/core';
+import {UserService} from "../../../../service/user.service";
+import {ConfigService, RequsetData} from "../../../../service/config.service";
+import {AlertController, LoadingController, ModalController, PickerController} from "@ionic/angular";
+import {IonInfiniteScroll} from '@ionic/angular';
+import {ActivatedRoute, Router} from "@angular/router";
+import {SearchComponent} from "../../../../comm/modal/search/search.component";
+import {WorkService} from "../../../../service/work.service";
+import {EventService} from "../../../../service/event.service";
+import {reqParams, SHYKApi} from "../../../../api/partylife/shyk";
+import OperateEnum from "../../../../enum/OperateEnum";
+
+@Component({
+  selector: 'app-shyk',
+  templateUrl: './shyk.component.html',
+  styleUrls: ['./shyk.component.scss'],
+})
+export class ShykComponent implements OnInit {
+  @ViewChild(IonInfiniteScroll, {static: true}) infiniteScroll: IonInfiniteScroll;
+
+  loading: any = null;
+  userInfo: any = {};
+  dataList: any[] = [];
+  searchParams: reqParams = {
+    pageIndex: 1,
+    pageSize: 15,
+    userId: this.userService.GetUser().userid,
+    dzzdm: '',
+    dzzmc: '',
+    type: '',
+    shykType: '',
+    title: '',
+    startDate: '',
+    endDate: ''
+  };
+  total: number = 15;
+  fieldList: any[] = [
+    {
+      label: '会议类别',
+      name: 'shykType',
+      type: 'select',
+      value: '',
+      dicParams: {
+        getUrl: 'getDictionaryList',
+        dicTypeKey: 'shykType',
+        textField: 'dicvalue',
+        valueField: 'dickey',
+        ismulti: true
+      }
+    },
+    /*{
+      label: '状态',
+      name: 'type',
+      type: 'select',
+      value: '',
+      dicParams: {getUrl: '', dicTypeKey: '', textField: 'name', valueField: 'type', ismulti: false},
+      dicList: [{name: '未开始', type: 1}, {name: '已结束', type: 2}]
+    },*/
+    {
+      label: '会议时间',
+      name: '',
+      type: 'group-datetime',
+      inputs: [{name: 'startDate', type: 'datetime', value: '', placeholder: '开始时间'}, {
+        name: 'endDate',
+        type: 'datetime',
+        value: '',
+        placeholder: '结束时间'
+      }]
+    }
+  ];
+
+
+  constructor(private router: Router, private routeInfo: ActivatedRoute, private configService: ConfigService, private userService: UserService, public alertController: AlertController, public modalController: ModalController,
+              public loadingController: LoadingController, private workService: WorkService, private eventService: EventService
+    , private shykApi: SHYKApi) {
+    this.eventService.eventEmit.on('reloadShykList', (result) => {
+      this.setParams();
+      this.reload();
+    });
+  }
+
+  ngOnInit() {
+    this.userInfo = this.userService.GetUser();
+    this.setParams();
+    this.reload();
+  }
+
+  setParams() {
+    this.routeInfo.queryParams.subscribe(params => {
+      this.searchParams.dzzdm = this.searchParams.dzzdm || params['dzzdm'] || this.userService.GetUser().dataDzzdm;
+      this.searchParams.dzzmc = this.searchParams.dzzmc || params['dzzmc'] || this.userService.GetUser().dataDzzmc;
+      this.searchParams.shykType = params['shykType'] || '';
+      this.searchParams.startDate = params['startDate'] || '';
+      this.searchParams.endDate = params['endDate'] || '';
+      this.fieldList[0].value = this.searchParams.shykType;
+      this.fieldList[1].inputs[0].value = this.searchParams.startDate;
+      this.fieldList[1].inputs[1].value = this.searchParams.endDate;
+    });
+  }
+
+  getList() {
+    this.shykApi.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);
+  }
+
+  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.type = data.params.type;
+      this.searchParams.shykType = data.params.shykType;
+      this.searchParams.startDate = data.params.startDate;
+      this.searchParams.endDate = data.params.endDate;
+      this.reload();
+    }
+  }
+
+  searchChange(event) {
+    this.searchParams.title = event.detail.value;
+    this.reload();
+  }
+
+  add() {
+    this.router.navigate(['./add'], {
+      relativeTo: this.routeInfo,
+      queryParams: {random: Math.random(), id: '', op: OperateEnum.新增}
+    });
+  }
+
+  edit(id) {
+    this.router.navigate(['./edit'], {
+      relativeTo: this.routeInfo,
+      queryParams: {random: Math.random(), id: id, op: OperateEnum.修改}
+    });
+  }
+
+  editRecord(id) {
+    this.router.navigate(['./record'], {relativeTo: this.routeInfo, queryParams: {id: id, random: Math.random()}});
+  }
+
+  delete(id) {
+    this.presentAlertConfirm("确认删除?", () => {
+      this.presentLoading("正在删除").then(val => {
+        this.shykApi.delete(id).subscribe((fdata: RequsetData) => {
+          this.loading.dismiss();
+          if (fdata.success) {
+            this.reload();
+
+            /*this.workService.getWorkSettingList();*/
+          }
+          this.presentAlert(fdata.msg);
+        });
+      });
+    });
+  }
+
+  async presentLoading(msg: string) {
+    this.loading = await this.loadingController.create({
+      message: msg,
+      spinner: 'circles'
+    });
+    return this.loading.present();
+  }
+
+  async presentAlert(msg: string) {
+    const alert = await this.alertController.create({
+      header: '提示',
+      subHeader: '',
+      message: msg,
+      buttons: ['确定']
+    });
+
+    await alert.present();
+  }
+
+  async presentAlertConfirm(msg: string, handler) {
+    const alert = await this.alertController.create({
+      header: '提示',
+      message: '<strong>' + msg + '</strong>',
+      buttons: [
+        {
+          text: '关闭',
+          role: 'cancel',
+          cssClass: 'secondary',
+          handler: () => {
+
+          }
+        }, {
+          text: '确定',
+          handler: handler
+        }
+      ]
+    });
+
+    await alert.present();
+  }
+
+}

+ 41 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/temp-user-select/temp-user-select.component.html

@@ -0,0 +1,41 @@
+<ion-header>
+  <ion-toolbar color="danger">
+    <ion-title>
+        邀请人员选择
+    </ion-title>
+    <ion-buttons slot="end">
+      <ion-button (click)="dismiss()">
+        取消
+      </ion-button>
+      <ion-button (click)="addTempUser()">
+        邀请
+      </ion-button>
+      <ion-button (click)="selectUser()">
+        选择
+      </ion-button>
+    </ion-buttons>
+  </ion-toolbar>
+</ion-header>
+<ion-searchbar #searchBox showCancelButton="never" placeholder="输入姓名查询"
+               (input)="search(searchBox.value)"></ion-searchbar>
+<ion-content>
+  <ion-list>
+    <ion-item *ngFor="let u of userList$|async;">
+        <ion-avatar slot="start">
+        <ion-checkbox color="danger" [disabled]="u.enable!=3"
+                    [(ngModel)]="u.isChecked"></ion-checkbox>
+        </ion-avatar>
+      <ion-label>
+        <h3>{{u.userName}}[{{ u.DZZMC }}]</h3>
+        <p>号码:{{u.mobile}},状态:{{u.enableName}}</p>
+        <p>邀请人:{{u.applierName}},{{u.applytime|date:"yyyy-MM-dd"}}</p>
+      </ion-label>
+    </ion-item>
+  </ion-list>
+  <ion-infinite-scroll threshold="100px" (ionInfinite)="scrollData($event)">
+    <ion-infinite-scroll-content
+            loadingSpinner="bubbles"
+            loadingText="正在加载...">
+    </ion-infinite-scroll-content>
+  </ion-infinite-scroll>
+</ion-content>

+ 0 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/temp-user-select/temp-user-select.component.scss


+ 144 - 0
parth5/parth5/src/app/views/pages/partylife/shyk/temp-user-select/temp-user-select.component.ts

@@ -0,0 +1,144 @@
+import { Component, OnInit,Input } from '@angular/core';
+import {IonInfiniteScroll, ModalController, NavParams,AlertController} from "@ionic/angular";
+import {ConfigService} from "../../../../../service/config.service";
+import {Observable,Subject,of} from "rxjs";
+import {debounceTime, distinctUntilChanged, switchMap} from "rxjs/operators";
+import {UserService} from "../../../../../service/user.service";
+
+@Component({
+  selector: 'app-temp-user-select',
+  templateUrl: './temp-user-select.component.html',
+  styleUrls: ['./temp-user-select.component.scss'],
+})
+export class TempUserSelectComponent implements OnInit {
+
+    @Input() partycode: string;
+    private searchUser=new Subject<string>();
+    userList$:Observable<any[]>;
+    userList: any[];
+    tempUsersUrl:string='/appApi/shyk/getTempUsers';
+    sendTempUserUrl='/appApi/shyk/sendTempUserMsg';
+    userInfo:any;
+
+  constructor(navParams: NavParams,private userService: UserService, private configService: ConfigService, public modalController: ModalController,private alertController:AlertController) {
+      this.userInfo=this.userService.GetUser();
+
+  }
+
+  ngOnInit() {
+
+        this.userList$=this.searchUser.pipe(
+            debounceTime(300),
+            //distinctUntilChanged(),
+            switchMap((term: string) => {
+                return of(this.userList.filter(u=>{
+                    if(term.length==0){
+                        return true;
+                    } else {
+                        return u.userName.indexOf(term)>=0;
+                    }
+                }));
+            })
+        );
+
+      this.loadDatas();
+  }
+
+  loadDatas(){
+      this.configService.HttpGetRomote(this.tempUsersUrl,{partycode:this.partycode}).subscribe(r=>{
+            this.userList=r.item;
+            this.searchUser.next('');
+      });
+  }
+
+  dismiss() {
+    this.modalController.dismiss({
+      'dismissed': true
+    });
+  }
+
+  selectUser() {
+
+      let users=this.userList.filter(u=>u.isChecked);
+
+      if(users.length==0){
+          this.presentAlert("请选择人员!");
+
+         return;
+      }
+
+    this.modalController.dismiss({
+      'dismissed': true,
+        'rtnData': users
+    });
+  }
+
+
+    addTempUser(){
+        this.presentAlertPrompt();
+    }
+
+    async presentAlert(msg:string){
+        const alert=await this.alertController.create({
+            header: '提示!',
+            message: msg,
+            buttons: ['OK']
+        });
+
+        await alert.present();
+    }
+
+  async presentAlertPrompt(){
+      const alert=await this.alertController.create({
+          header: '邀请人员',
+          inputs: [
+              {
+                  name: 'mobile',
+                  type: 'text',
+                  placeholder: '请输入电话号码'
+              }],
+          buttons: [
+              {
+                  text: '取消',
+                  role: 'cancel',
+                  cssClass: 'secondary',
+                  handler: () => {
+                      console.log('Confirm Cancel');
+                  }
+              }, {
+                  text: '确定',
+                  handler: (prompt) => {
+
+                      this.configService.HttpPostRomote(this.sendTempUserUrl,{
+                          mobile:prompt.mobile,
+                          partyid:this.partycode,
+                          applierid:this.userInfo.userid,
+                          XM:this.userInfo.username,
+                          DZZMC:this.userInfo.DZZMC
+                      }).subscribe(r=>{
+                            if(r.success){
+                                this.loadDatas();
+                            } else {
+                                this.presentAlert(r.msg);
+                            }
+                      });
+
+                  }
+              }
+          ]
+
+      });
+
+      await alert.present();
+  }
+
+  //下拉刷新
+  scrollData(event) {
+
+  }
+
+  search(text){
+        this.searchUser.next(text);
+  }
+
+}

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

@@ -2,6 +2,7 @@ import {Routes} from "@angular/router";
 import {TabMainPage} from "./tab-main.page";
 import partyInfoRoutes from "../../../routes/partyInfo";
 import partyUserRoutes from "../../../routes/partyUser";
+import shykRoutes from "../../../routes/shyk";
 
 export const routes: Routes = [
   {
@@ -9,5 +10,6 @@ export const routes: Routes = [
     component: TabMainPage
   },
   ...partyInfoRoutes,
-  ...partyUserRoutes
+  ...partyUserRoutes,
+  ...shykRoutes
 ];

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

@@ -7,13 +7,34 @@ import {PartysearchComponent} from "../../../comm/modal/partysearch/partysearch.
 import {PartytreeComponent} from "../../../comm/modal/partytree/partytree.component";
 import {SearchComponent} from "../../../comm/modal/search/search.component";
 import {routes} from "./tab-main-routes";
+import {EmptyComponent} from "../../../comm/modal/empty/empty.component";
+import {Routes} from "@angular/router";
+import {PartyselectComponent} from "../../../comm/modal/partyselect/partyselect.component";
+import {ImglistComponent} from "../../../comm/modal/imglist/imglist.component";
+import {PhotoshowComponent} from "../../../comm/modal/photoshow/photoshow.component";
+import {PhotoSwipeComponent} from "../../../comm/modal/photo-swipe/photo-swipe.component";
 
 const pubComponents = [
   PartysearchComponent,
   PartytreeComponent,
-  SearchComponent
+  SearchComponent,
+  EmptyComponent,
+  PartyselectComponent,
+  ImglistComponent,
+  PhotoshowComponent,
+  PhotoSwipeComponent
 ];
 
+/*function getRoutesComponent(routes: Routes) {
+  let components = [];
+  routes.forEach(r => {
+    components.push(r.component);
+    if (r.children)
+      components = components.concat(getRoutesComponent(r.children));
+  });
+  return components;
+}*/
+
 @NgModule({
   imports: [
     CommonModule,

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

@@ -46,7 +46,7 @@ export class TabMainPage implements OnInit {
 
   modularClick(url) {
     if (url != '' && url != null) {
-      this.router.navigate([url], {queryParams: {random: Math.random()}});
+      this.router.navigate(['/tapp/tabs/tabMain' + url], {queryParams: {random: Math.random()}});
     } else {
       this.presentAlert("正在建设中");
     }

+ 2 - 2
parth5/parth5/src/app/views/tapp/tabs/tabs-routing.module.ts

@@ -21,14 +21,14 @@ const routes: Routes = [
       },
       {
         path: '',
-        redirectTo: '/tabs/tabMain',
+        redirectTo: '/tapp/tabs/tabMain',
         pathMatch: 'full'
       }
     ]
   },
   {
     path: '',
-    redirectTo: '/tabs/tabMain',
+    redirectTo: '/tapp/tabs/tabMain',
     pathMatch: 'full'
   }
 ];

+ 5 - 14
src/main/java/com/ghsc/partybuild/controller/AppShykController.java

@@ -30,8 +30,8 @@ public class AppShykController {
 
     @ResponseBody
     @GetMapping("/getMeetingList")
-    public RequsetData<PageInfo<HashMap<String, Object>>> GetMeetingList(@RequestParam("pageindex") int pageIndex,
-                                                                         @RequestParam("pagesize") int pageSize, @RequestParam(required = false) String dzzdm, @RequestParam(required = false) String userId,
+    public RequsetData<PageInfo<HashMap<String, Object>>> GetMeetingList(@RequestParam("pageIndex") int pageIndex,
+                                                                         @RequestParam("pageSize") int pageSize, @RequestParam(required = false) String dzzdm, @RequestParam(required = false) String userId,
                                                                          @RequestParam(required = false) List<String> shykTypeList, @RequestParam(required = false) String title,
                                                                          @RequestParam(required = false) String startDate,
                                                                          @RequestParam(required = false) String endDate) {
@@ -71,7 +71,6 @@ public class AppShykController {
             model = new ShykMeeting();
             model.setMeetingid(uuid.toString());
             model.setShyktype(shyktype);
-            /*model.setShykstatus(0);*/
             model.setIstemp(0);
             model.setCreateuserid(userId);
             model.setCreateusername(userName);
@@ -79,15 +78,6 @@ public class AppShykController {
             model.setPartycode(dzzdm);
             model.setPartyname(dzzmc);
 
-            if (shyktype == 3) { //查询成员所在党小组
-                /*List<HashMap<String, Object>> dxzList = partyUserService.getDxzUserList(1, 1000, null,userId,
-                        null, null, null, null, null, null, null, null).getList();
-                if (dxzList.size() > 0) {
-                    model.setPartycode(dxzList.get(0).get("SZDXZBM").toString());
-                    model.setPartyname(dxzList.get(0).get("SZDXZMC").toString());
-                }*/
-            }
-
             if (model.getShyktype() != null) {
                 shykTypeName = dictionaryService.getDicByKey(model.getShyktype(), dic_shykType).getDicvalue();
             }
@@ -99,7 +89,8 @@ public class AppShykController {
                     model.getBegintime());//会议相差的分钟数
         }*/
         //当前用户参加会议信息
-        user = shykService.getMeetinguserByUserCode(model.getMeetingid(), userId);
+        if (!stringUtils.IsNullOrEmpty(userId))
+            user = shykService.getMeetinguserByUserCode(model.getMeetingid(), userId);
         //会议类型
         if (model.getShyktype() != null) {
             shykTypeName = dictionaryService.getDicByKey(model.getShyktype(), dic_shykType).getDicvalue();
@@ -641,7 +632,7 @@ public class AppShykController {
     @ResponseBody
     @GetMapping("/getMyMeetingList")
     public RequsetData<PageInfo<HashMap<String, Object>>> getMyMeetingList(@RequestParam("pageIndex") int pageIndex,
-                                                                         @RequestParam("pageSize") int pageSize, @RequestParam("userId") String userId) {
+                                                                           @RequestParam("pageSize") int pageSize, @RequestParam("userId") String userId) {
 
         RequsetData<PageInfo<HashMap<String, Object>>> result = new RequsetData<>();