drew před 5 roky
rodič
revize
5c67532a0e
32 změnil soubory, kde provedl 275 přidání a 1909 odebrání
  1. 1 0
      db/migrate002.sql
  2. 0 81
      src/main/db/Example-dbdiagram.sql
  3. 0 92
      src/main/db/contract.sql
  4. 0 200
      src/main/db/zmj-dbdiagram.sql
  5. 4 0
      src/main/java/com/izouma/zhumj/config/Constants.java
  6. 20 98
      src/main/java/com/izouma/zhumj/domain/sale/Contract.java
  7. 1 1
      src/main/java/com/izouma/zhumj/domain/sale/ContractContact.java
  8. 1 1
      src/main/java/com/izouma/zhumj/domain/sale/ContractStore.java
  9. 3 20
      src/main/java/com/izouma/zhumj/domain/sale/Customer.java
  10. 23 0
      src/main/java/com/izouma/zhumj/event/ContractUpdateEvent.java
  11. 6 0
      src/main/java/com/izouma/zhumj/repo/StoreNoticeRepo.java
  12. 3 3
      src/main/java/com/izouma/zhumj/repo/sale/ContractContactRepo.java
  13. 2 2
      src/main/java/com/izouma/zhumj/repo/sale/CustomerRepo.java
  14. 20 1
      src/main/java/com/izouma/zhumj/service/StoreNoticeService.java
  15. 13 0
      src/main/java/com/izouma/zhumj/service/sale/ContractContactService.java
  16. 0 14
      src/main/java/com/izouma/zhumj/service/sale/ContractContactsService.java
  17. 52 55
      src/main/java/com/izouma/zhumj/service/sale/ContractService.java
  18. 11 24
      src/main/java/com/izouma/zhumj/service/sale/CustomerService.java
  19. 4 4
      src/main/java/com/izouma/zhumj/service/sale/SaleWorkService.java
  20. 62 0
      src/main/java/com/izouma/zhumj/web/sale/ContractContactController.java
  21. 0 69
      src/main/java/com/izouma/zhumj/web/sale/ContractContactsController.java
  22. 8 8
      src/main/vue/src/components/ResidenceData.vue
  23. 3 3
      src/main/vue/src/router.js
  24. 6 0
      src/main/vue/src/views/Operation/RoomStatus.vue
  25. 5 14
      src/main/vue/src/views/sale/ContractContactList.vue
  26. 16 16
      src/main/vue/src/views/sale/ContractEdit.vue
  27. 0 1167
      src/main/vue/src/views/sale/ContractEditBak.vue
  28. 5 17
      src/main/vue/src/views/sale/ContractList.vue
  29. 1 1
      src/main/vue/src/views/sale/RecoveryContractList.vue
  30. 5 5
      src/test/java/com/izouma/zhumj/repo/sale/ContractRepoTest.java
  31. 0 7
      src/test/java/com/izouma/zhumj/service/sale/CustomerServiceTest.java
  32. 0 6
      src/test/java/com/izouma/zhumj/service/sale/SaleAchievementServiceTest.java

+ 1 - 0
db/migrate002.sql

@@ -0,0 +1 @@
+rename table contract_contacts to contract_contact;

+ 0 - 81
src/main/db/Example-dbdiagram.sql

@@ -1,81 +0,0 @@
-// -- https://dbdiagram.io/home
-
-//// -- LEVEL 1
-//// -- Tables and References
-
-// Creating tables
-Table users as U {
-  id int
-  full_name varchar
-  created_at timestamp
-  country_code int
-}
-
-Table merchants {
-  id int
-  merchant_name varchar
-  country_code int
-  "created at" varchar
-  admin_id int [ref: > U.id] // inline relationship (many-to-one)
-}
-
-Table countries {
-  code int
-  name varchar
-  continent_name varchar
- }
-
-// Creating references
-// You can also define relaionship separately
-// > many-to-one; < one-to-many; - one-to-one
-Ref: U.country_code > countries.code
-Ref: merchants.country_code > countries.code
-
-//----------------------------------------------//
-
-//// -- LEVEL 2
-//// -- Adding column settings
-
-Table order_items {
-  order_id int [increment, ref: > orders.id] // auto-increment
-  product_id int
-  quantity int [default: 1] // default value
-}
-
-Ref: order_items.product_id > products.id
-
-Table orders {
-  id int [pk] // primary key
-  user_id int [not null, unique]
-  status varchar
-  created_at varchar [note: 'When order created'] // add column note
-}
-
-//----------------------------------------------//
-
-//// -- Level 3
-//// -- Enum, Indexes
-
-// Enum for 'products' table below
-Enum products_status {
-  out_of_stock
-  in_stock
-  running_low [note: 'less than 20'] // add column note
-}
-
-// Indexes: You can define a single or multi-column index
-Table products {
-  id int [pk]
-  name varchar
-  merchant_id int [not null]
-  price int
-  status products_status
-  created_at datetime [default: `now()`]
-
-  Indexes {
-    (merchant_id, status) [name:'product_status']
-    id [unique]
-  }
-}
-
-Ref: products.merchant_id > merchants.id // many-to-one

+ 0 - 92
src/main/db/contract.sql

@@ -1,92 +0,0 @@
-CREATE TABLE `contract` (
-  `id` bigint,
-  `created_at` datetime,
-  `created_by` varchar(255),
-  `modified_at` datetime,
-  `modified_by` varchar(255),
-  `pay_type` varchar(255),
-  `beds` int,
-  `co_full_name` varchar(255),
-  `co_simple_name` varchar(255),
-  `contact_address` varchar(255),
-  `contact_phone` varchar(255),
-  `contacts` varchar(255),
-  `contract_begin_time` datetime,
-  `contract_days` int,
-  `contract_end_time` datetime,
-  `contract_number` varchar(255),
-  `contract_renewals` int,
-  `contract_status` int,
-  `contract_total_rent` decimal,
-  `customer_industry` varchar(255),
-  `customer_source` varchar(255),
-  `department_id` varchar(255),
-  `department_name` varchar(255),
-  `deposit` decimal,
-  `enabled` bit,
-  `monthly_rent` decimal,
-  `price` decimal,
-  `room_type` varchar(255),
-  `sale_id` varchar(255),
-  `sale_name` varchar(255),
-  `status` varchar(255)
-);
-
-CREATE TABLE `customer` (
-  `id` bigint,
-  `created_at` datetime,
-  `created_by` varchar(255),
-  `modified_at` datetime,
-  `modified_by` varchar(255),
-  `bed_amount` int,
-  `co_full_name` varchar(255),
-  `co_simple_name` varchar(255),
-  `contract_amount` decimal,
-  `contract_numbers` varchar(255),
-  `contracts` int,
-  `cooperate_days` int,
-  `monthly_of_bed` int,
-  `monthly_rent` decimal,
-  `renewals` int,
-  `status` varchar(255),
-  `enabled` bit
-);
-
-CREATE TABLE `renewal` (
-  `id` bigint,
-  `created_at` datetime,
-  `created_by` varchar(255),
-  `modified_at` datetime,
-  `modified_by` varchar(255),
-  `contract_number` varchar(255),
-  `renewal_begin_time` datetime,
-  `renewal_end_time` datetime,
-  `renewal_number` varchar(255),
-  `renewal_price` varchar(255),
-  `renewal_room_type` varchar(255),
-  `renewal_store` varchar(255),
-  `enabled` bit
-);
-
-CREATE TABLE `residence` (
-  `id` bigint,
-  `created_at` datetime,
-  `created_by` varchar(255),
-  `modified_at` datetime,
-  `modified_by` varchar(255),
-  `contract_number` varchar(255),
-  `customer_loss` varchar(255),
-  `residence_reason` varchar(255),
-  `residence_room_type` varchar(255),
-  `residence_time` datetime,
-  `residence_type` varchar(255),
-  `enabled` bit
-);
-
-ALTER TABLE `contract` ADD FOREIGN KEY (`contract_number`) REFERENCES `renewal` (`contract_number`);
-
-ALTER TABLE `contract` ADD FOREIGN KEY (`contract_number`) REFERENCES `residence` (`contract_number`);
-
-ALTER TABLE `contract` ADD FOREIGN KEY (`co_full_name`) REFERENCES `customer` (`co_full_name`);
-
-ALTER TABLE `contract` ADD FOREIGN KEY (`co_simple_name`) REFERENCES `customer` (`co_simple_name`);

+ 0 - 200
src/main/db/zmj-dbdiagram.sql

@@ -1,200 +0,0 @@
-Table "authority" {
-  "name" varchar(50) [pk, not null]
-}
-
-Table "contract" {
-  "id" bigint(20) [pk, not null]
-  "created_at" datetime [default: NULL]
-  "created_by" varchar(255) [default: NULL]
-  "modified_at" datetime [default: NULL]
-  "modified_by" varchar(255) [default: NULL]
-  "pay_type" int(11) [default: NULL]
-  "beds" varchar(255) [default: NULL]
-  "co_full_name" varchar(255) [default: NULL]
-  "co_simple_name" varchar(255) [default: NULL]
-  "contact_address" varchar(255) [default: NULL]
-  "contact_phone" varchar(255) [default: NULL]
-  "contacts" varchar(255) [default: NULL]
-  "contract_begin_time" datetime [default: NULL]
-  "contract_days" int(11) [default: NULL]
-  "contract_end_time" datetime [default: NULL]
-  "contract_number" varchar(255) [default: NULL]
-  "contract_renewals" int(11) [default: NULL]
-  "contract_total_rent" "decimal(19, 2)" [default: NULL]
-  "customer_industry" varchar(255) [default: NULL]
-  "customer_source" varchar(255) [default: NULL]
-  "department_id" varchar(255) [default: NULL]
-  "deposit" "decimal(19, 2)" [default: NULL]
-  "monthly_rent" "decimal(19, 2)" [default: NULL]
-  "price" "decimal(19, 2)" [default: NULL]
-  "room_type" varchar(255) [default: NULL]
-  "sale_id" varchar(255) [default: NULL]
-  "sale_name" varchar(255) [default: NULL]
-  "status" int(11) [default: NULL]
-  "contract_status" int(11) [default: NULL]
-}
-
-Table "customer" {
-  "id" bigint(20) [pk, not null]
-  "created_at" datetime [default: NULL]
-  "created_by" varchar(255) [default: NULL]
-  "modified_at" datetime [default: NULL]
-  "modified_by" varchar(255) [default: NULL]
-  "bed_amount" int(11) [default: NULL]
-  "co_full_name" varchar(255) [default: NULL]
-  "co_simple_name" varchar(255) [default: NULL]
-  "contract_amount" int(11) [default: NULL]
-  "contract_numbers" varchar(255) [default: NULL]
-  "contracts" int(11) [default: NULL]
-  "cooperate_days" int(11) [default: NULL]
-  "monthly_of_bed" int(11) [default: NULL]
-  "monthly_rent" int(11) [default: NULL]
-  "renewals" int(11) [default: NULL]
-  "status" int(11) [default: NULL]
-}
-
-Table "deposit_record" {
-  "id" bigint(20) [pk, not null]
-  "created_at" datetime [default: NULL]
-  "created_by" varchar(255) [default: NULL]
-  "modified_at" datetime [default: NULL]
-  "modified_by" varchar(255) [default: NULL]
-  "status" varchar(255) [default: NULL]
-  "user_id" bigint(20) [default: NULL]
-  "amount" "decimal(10, 2)" [default: NULL]
-  "refund_time" datetime [default: NULL]
-  "transaction_id" varchar(255) [default: NULL]
-}
-
-Table "hibernate_sequence" {
-  "next_val" bigint(20) [default: NULL]
-}
-
-Table "menu" {
-  "id" bigint(20) [pk, not null]
-  "created_at" datetime [default: NULL]
-  "created_by" varchar(255) [default: NULL]
-  "modified_at" datetime [default: NULL]
-  "modified_by" varchar(255) [default: NULL]
-  "enabled" bit(1) [default: NULL]
-  "icon" varchar(255) [default: NULL]
-  "name" varchar(255) [default: NULL]
-  "parent" bigint(20) [default: NULL]
-  "path" varchar(255) [default: NULL]
-  "root" bit(1) [default: NULL]
-  "sort" int(11) [default: NULL]
-  "active" bit(1) [default: NULL]
-
-
-Indexes {
-  parent [name: "FK7pl0e1gmqbk4hy5wm4a7e9xvn"]
-}
-}
-
-Table "renewal" {
-  "id" bigint(20) [pk, not null]
-  "created_at" datetime [default: NULL]
-  "created_by" varchar(255) [default: NULL]
-  "modified_at" datetime [default: NULL]
-  "modified_by" varchar(255) [default: NULL]
-  "contract_number" varchar(255) [default: NULL]
-  "renewal_begin_time" datetime [default: NULL]
-  "renewal_end_time" datetime [default: NULL]
-  "renewal_number" varchar(255) [default: NULL]
-  "renewal_price" varchar(255) [default: NULL]
-  "renewal_room_type" varchar(255) [default: NULL]
-  "renewal_store" varchar(255) [default: NULL]
-}
-
-Table "residence" {
-  "id" bigint(20) [pk, not null]
-  "created_at" datetime [default: NULL]
-  "created_by" varchar(255) [default: NULL]
-  "modified_at" datetime [default: NULL]
-  "modified_by" varchar(255) [default: NULL]
-  "contract_number" varchar(255) [default: NULL]
-  "customer_loss" int(11) [default: NULL]
-  "residence_reason" int(11) [default: NULL]
-  "residence_room_type" varchar(255) [default: NULL]
-  "residence_time" datetime [default: NULL]
-  "residence_type" int(11) [default: NULL]
-}
-
-Table "tenant" {
-  "id" bigint(20) [pk, not null]
-  "created_at" datetime [default: NULL]
-  "created_by" varchar(255) [default: NULL]
-  "modified_at" datetime [default: NULL]
-  "modified_by" varchar(255) [default: NULL]
-  "user_id" bigint(20) [default: NULL]
-  "id_number" varchar(255) [default: NULL]
-  "name" varchar(255) [default: NULL]
-  "deposit_record_id" bigint(20) [default: NULL]
-  "deposit_status" varchar(255) [default: NULL]
-
-
-Indexes {
-  user_id [name: "FKmoj8m61gtmcdo59nh0574w7q1"]
-  deposit_record_id [name: "FKop8n9dnt18j79x5jj2j7cogd2"]
-}
-}
-
-Table "test_gen_code" {
-  "id" bigint(20) [pk, not null]
-  "created_at" datetime [default: NULL]
-  "created_by" varchar(255) [default: NULL]
-  "modified_at" datetime [default: NULL]
-  "modified_by" varchar(255) [default: NULL]
-  "avatar" varchar(255) [default: NULL]
-  "enabled" bit(1) [not null]
-  "nickname" varchar(255) [default: NULL]
-  "password" varchar(255) [default: NULL]
-  "testa" varchar(255) [default: NULL]
-  "testb" varchar(255) [default: NULL]
-  "testc" varchar(255) [default: NULL]
-  "username" varchar(50) [not null]
-
-
-Indexes {
-  username [unique, name: "UK_rsfm5xkv6pau8t88wssll1pt4"]
-}
-}
-
-Table "user" {
-  "id" bigint(20) [pk, not null]
-  "created_at" datetime [default: NULL]
-  "created_by" varchar(255) [default: NULL]
-  "modified_at" datetime [default: NULL]
-  "modified_by" varchar(255) [default: NULL]
-  "enabled" bit(1) [not null]
-  "nickname" varchar(255) [default: NULL]
-  "password" varchar(255) [default: NULL]
-  "username" varchar(50) [not null]
-  "avatar" varchar(255) [default: NULL]
-
-
-Indexes {
-  username [unique, name: "user_username_uindex"]
-}
-}
-
-Table "user_authority" {
-  "user_id" bigint(20) [default: NULL]
-  "authority_name" varchar(50) [default: NULL]
-
-
-Indexes {
-  authority_name [name: "FK6ktglpl5mjosa283rvken2py5"]
-  user_id [name: "FKpqlsjpkybgos9w2svcri7j8xy"]
-}
-}
-
-Ref:"menu"."id" < "menu"."parent"
-
-Ref:"user"."id" < "tenant"."user_id"
-
-Ref:"deposit_record"."id" < "tenant"."deposit_record_id"
-
-Ref:"user"."id" < "user_authority"."user_id"
-
-Ref:"authority"."name" < "user_authority"."authority_name"

+ 4 - 0
src/main/java/com/izouma/zhumj/config/Constants.java

@@ -1,5 +1,7 @@
 package com.izouma.zhumj.config;
 
+import java.time.LocalTime;
+
 public interface Constants {
 
     interface Regex {
@@ -21,4 +23,6 @@ public interface Constants {
     String ATTACH_REMARK        = "remark";
     String ATTACH_AMOUNT        = "amount";
     String ATTACH_RECHARGE_TYPE = "rechargeType";
+
+    LocalTime TIME_MAX = LocalTime.of(23, 59, 59);
 }

+ 20 - 98
src/main/java/com/izouma/zhumj/domain/sale/Contract.java

@@ -23,25 +23,13 @@ import java.time.LocalDateTime;
 import java.util.ArrayList;
 import java.util.List;
 
-/**
- * 合同管理预约订单
- *
- * @Author: Pine
- * @Date: 2019/10/9
- * @Email:771190883@qq.com
- */
-
 @Data
 @Entity
 @AllArgsConstructor
 @NoArgsConstructor
 @Builder
-
 @ApiModel(value = "合同管理预约订单", description = "合同管理预约订单")
 public class Contract extends BaseEntity implements Serializable {
-    /**
-     * 合同编号
-     */
     @ApiModelProperty(value = "合同编号", name = "contractNumber")
     @NotEmpty(message = "合同编号不能为空")
     @Column(length = 50, unique = true)
@@ -53,15 +41,9 @@ public class Contract extends BaseEntity implements Serializable {
     @Searchable
     private String firstContractNumber;
 
-    /**
-     * 公司简称
-     */
     @ApiModelProperty(value = "公司id", name = "customerId")
     private Long customerId;
 
-    /**
-     * 公司简称
-     */
     @ApiModelProperty(value = "品牌id", name = "brandId")
     private Long brandId;
 
@@ -69,113 +51,71 @@ public class Contract extends BaseEntity implements Serializable {
     @JoinColumn(name = "customerId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
     @NotFound(action = NotFoundAction.IGNORE)
     private Customer   customer;
-    /**
-     * 月租金
-     */
+
     @ApiModelProperty(value = "月租金", name = "monthlyRent")
     private BigDecimal monthlyRent;
 
-    /**
-     * 月租金
-     */
     @ApiModelProperty(value = "日租金", name = "dayRent")
 //    @NotNull(message = "日租金不能为空")
     private BigDecimal    dayRent;
-    /**
-     * 合同总租金
-     */
+
     @ApiModelProperty(value = "合同总租金", name = "contractTotalRent")
 //    @NotNull(message = "合同总租金不能为空")
     private BigDecimal    contractTotalRent;
-    /**
-     * 合同开始时间
-     */
+
     @ApiModelProperty(value = "合同开始时间", name = "contractBeginTime")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @NotNull(message = "合同开始时间不能为空")
     private LocalDateTime contractBeginTime;
-    /**
-     * 合同结束时间
-     */
+
     @ApiModelProperty(value = "合同结束时间", name = "contractEndTime")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     @NotNull(message = "合同结束时间不能为空")
     private LocalDateTime contractEndTime;
-    /**
-     * 合同期(天)
-     */
+
     @ApiModelProperty(value = "合同期(天)", name = "contractDays")
     @NotNull(message = "合同期(天数)不能为空")
     private Integer       contractDays;
-    /**
-     * 合同期(月)
-     */
+
     @ApiModelProperty(value = "合同期(月)", name = "contractDays")
     @NotNull(message = "合同期(月数)不能为空")
     private Integer       contractMonthly;
-    /**
-     * 付款方式
-     */
 
     @ApiModelProperty(value = "付", name = "payType")
 //    @NotNull(message = "付款方式不能为空")
     private Integer       pay;
 
-    /**
-     * 付款方式
-     */
-
     @ApiModelProperty(value = "押", name = "payType")
 //    @NotNull(message = "付款方式不能为空")
     private Integer bet;
-    /**
-     * 续约次数
-     */
+
     @ApiModelProperty(value = "续约次数", name = "contractRenewals")
     private Integer contractRenewals = 0;
-    /**
-     * 销售员
-     */
+
     @ApiModelProperty(value = "销售员", name = "saleName")
     @NotNull(message = "销售员不能为空")
     private String  saleName;
-    /**
-     * 销售员ID
-     */
+
     @ApiModelProperty(value = "销售员ID", name = "saleId")
     @NotNull(message = "销售员不能为空")
     private Long    saleId;
-    /**
-     * 销售员部门id(预留)
-     */
+
     @ApiModelProperty(value = "销售员部门id", name = "departmentId")
     private Long    departmentId;
-    /**
-     * 销售员部门名称(预留)
-     */
+
     @ApiModelProperty(value = "销售员部门名称", name = "departmentName")
     private String  departmentName;
 
-    /**
-     * 销售员小组id
-     */
     @ApiModelProperty(value = "销售员部门id", name = "departmentId")
     private Long           groupId;
-    /**
-     * 销售员小组
-     */
+
     @ApiModelProperty(value = "销售员部门名称", name = "departmentName")
     private String         groupName;
-    /**
-     * 客户来源
-     */
+
     @ApiModelProperty(value = "客户来源", name = "customerSource")
     @Enumerated(EnumType.STRING)
     private CustomerSource customerSource;
 
-    /**
-     * 合作模式
-     */
     @ApiModelProperty(value = "合作模式", name = "cooperation")
     @Enumerated(EnumType.STRING)
     private CheckInType checkInType;
@@ -183,41 +123,26 @@ public class Contract extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "合同来源", name = "contractSource")
     @Enumerated(EnumType.STRING)
     private ContractSource contractSource;
-    /**
-     * 客户行业
-     */
+
     @ApiModelProperty(value = "客户行业", name = "customerIndustry")
     private String         customerIndustry;
-    /**
-     * 联系地址
-     */
+
     @ApiModelProperty(value = "联系地址", name = "contactAddress")
     private String         contactAddress;
-    /**
-     * 状态(1 在住 0 已退)
-     */
+
     @ApiModelProperty(value = "状态(在住  已退)", name = "status")
     @Enumerated(EnumType.STRING)
     private ContractStatus status;
-    /**
-     * 合同数据更新状态(未开始 已更新)
-     */
+
     @ApiModelProperty(value = "合同数据更新状态(未开始 已更新)", name = "contractStatus")
     private ContractDataUp contractStatus;
 
-    /**
-     * 合同付款状态
-     */
     @ApiModelProperty(value = "合同付款状态", name = "contractPayStatus")
     private String contractPayStatus;
 
-    /**
-     * 总床位数
-     */
     @ApiModelProperty(value = "总床位数", name = "bedsAmount")
     private Integer bedsAmount;
 
-
     @ApiModelProperty(value = "合同备注", name = "note")
     private String note;
 
@@ -227,14 +152,13 @@ public class Contract extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "押金", name = "flowBet")
     private BigDecimal flowBet;
 
-
     @Column(nullable = false)
     private Boolean enabled = true;
 
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
     @JoinColumn(name = "contractNumber", referencedColumnName = "contractNumber", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
-    @ApiModelProperty(value = "合同联系人", name = "contactsList")
-    List<ContractContacts> contactsList = new ArrayList<>();
+    @ApiModelProperty(value = "合同联系人", name = "contactList")
+    List<ContractContact> contactList = new ArrayList<>();
 
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
     @JoinColumn(name = "contractNumber", referencedColumnName = "contractNumber", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
@@ -243,7 +167,7 @@ public class Contract extends BaseEntity implements Serializable {
 
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
     @JoinColumn(name = "contractNumber", referencedColumnName = "contractNumber", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
-    @ApiModelProperty(value = "合同预定房型", name = "contactsList")
+    @ApiModelProperty(value = "合同预定房型", name = "roomList")
     List<ContractRoom> roomList = new ArrayList<>();
 
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@@ -267,7 +191,5 @@ public class Contract extends BaseEntity implements Serializable {
     //查询合同类型条件
     @Transient
     private String contractType;
-
-
 }
 

+ 1 - 1
src/main/java/com/izouma/zhumj/domain/sale/ContractContacts.java → src/main/java/com/izouma/zhumj/domain/sale/ContractContact.java

@@ -29,7 +29,7 @@ import java.io.Serializable;
 @Builder
 @Where(clause = "enabled = 1")
 @ApiModel(value = "合同联系人", description = "合同联系人")
-public class ContractContacts extends BaseEntity implements Serializable {
+public class ContractContact extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "合同编号", name = "contractNumber")
     @NotEmpty(message = "合同编号不能为空")
     @Column(length = 50)

+ 1 - 1
src/main/java/com/izouma/zhumj/domain/sale/ContractStore.java

@@ -67,7 +67,7 @@ public class ContractStore extends BaseEntity implements Serializable {
             @JoinColumn(name = "contractNumber", referencedColumnName = "contractNumber", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)),
             @JoinColumn(name = "storeInfoId", referencedColumnName = "storeId", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
     })
-    @ApiModelProperty(value = "合同预定房型", name = "contactsList")
+    @ApiModelProperty(value = "合同预定房型", name = "roomList")
     List<ContractRoom> roomList = new ArrayList<>();
 
     /**

+ 3 - 20
src/main/java/com/izouma/zhumj/domain/sale/Customer.java

@@ -27,13 +27,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-/**
- * com.izouma.zhumj.domain.sale
- *
- * @author Pine
- * @email 771190883@qq.com
- * @date 2019/10/10
- */
+
 @Data
 @Entity
 @AllArgsConstructor
@@ -49,7 +43,7 @@ public class Customer extends BaseEntity implements Serializable {
 
     @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
     @JoinColumn(name = "customerId", insertable = false, updatable = false, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
-    @ApiModelProperty(value = "合同集合", name = "contactsList")
+    @ApiModelProperty(value = "合同集合", name = "contractList")
     @JsonIgnore
     List<Contract> contractList = new ArrayList<>();
 
@@ -69,9 +63,7 @@ public class Customer extends BaseEntity implements Serializable {
     @Searchable
     @ApiModelProperty(value = "公司简称", name = "coSimpleName")
     private String coSimpleName;
-    /**
-     * 客户来源
-     */
+    
     @ApiModelProperty(value = "客户来源", name = "customerSource")
     @Enumerated(EnumType.STRING)
     private CustomerSource customerSource;
@@ -79,16 +71,10 @@ public class Customer extends BaseEntity implements Serializable {
     @Enumerated(EnumType.STRING)
     private ContractStatus status;
 
-    /**
-     * 合作模式
-     */
     @ApiModelProperty(value = "合作模式", name = "cooperation")
     @Enumerated(EnumType.STRING)
     private CheckInType checkInType;
 
-    /**
-     * 联系地址
-     */
     @ApiModelProperty(value = "联系地址", name = "contactAddress")
     private String contactAddress;
 
@@ -122,9 +108,6 @@ public class Customer extends BaseEntity implements Serializable {
     @ApiModelProperty(value = "意向客户", name = "intention")
     private String intention;
 
-    /**
-     * 客户行业
-     */
     @ApiModelProperty(value = "客户行业", name = "customerIndustry")
     private String customerIndustry;
 

+ 23 - 0
src/main/java/com/izouma/zhumj/event/ContractUpdateEvent.java

@@ -0,0 +1,23 @@
+package com.izouma.zhumj.event;
+
+import com.izouma.zhumj.domain.sale.Contract;
+import org.springframework.context.ApplicationEvent;
+
+public class ContractUpdateEvent extends ApplicationEvent {
+    private final Contract oldContract;
+    private final Contract newContract;
+
+    public ContractUpdateEvent(Object source,Contract oldContract, Contract newContract) {
+        super(source);
+        this.oldContract = oldContract;
+        this.newContract = newContract;
+    }
+
+    public Contract getOldContract() {
+        return oldContract;
+    }
+
+    public Contract getNewContract() {
+        return newContract;
+    }
+}

+ 6 - 0
src/main/java/com/izouma/zhumj/repo/StoreNoticeRepo.java

@@ -6,6 +6,7 @@ import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 public interface StoreNoticeRepo extends JpaRepository<StoreNotice, Long>, JpaSpecificationExecutor<StoreNotice> {
 
@@ -14,4 +15,9 @@ public interface StoreNoticeRepo extends JpaRepository<StoreNotice, Long>, JpaSp
     Long countByStoreIdAndNoticeTimeBetweenAndStatus(Long storeId, LocalDateTime start, LocalDateTime end, StoreNoticeStatus status);
 
     void deleteByContractId(Long contractId);
+
+    List<StoreNotice> findByContractIdAndStoreId(Long contractId, Long storeId);
+
+    void deleteByContractIdAndStoreId(Long contractId, Long storeId);
+
 }

+ 3 - 3
src/main/java/com/izouma/zhumj/repo/sale/ContractContactsRepo.java → src/main/java/com/izouma/zhumj/repo/sale/ContractContactRepo.java

@@ -1,6 +1,6 @@
 package com.izouma.zhumj.repo.sale;
 
-import com.izouma.zhumj.domain.sale.ContractContacts;
+import com.izouma.zhumj.domain.sale.ContractContact;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
 import org.springframework.data.jpa.repository.Modifying;
@@ -8,8 +8,8 @@ import org.springframework.data.jpa.repository.Query;
 
 import javax.transaction.Transactional;
 
-public interface ContractContactsRepo extends JpaRepository<ContractContacts, Long>, JpaSpecificationExecutor<ContractContacts> {
-    @Query("update ContractContacts t set t.enabled = false where t.id = ?1")
+public interface ContractContactRepo extends JpaRepository<ContractContact, Long>, JpaSpecificationExecutor<ContractContact> {
+    @Query("update ContractContact t set t.enabled = false where t.id = ?1")
     @Modifying
     @Transactional
     void deleteById(Long id);

+ 2 - 2
src/main/java/com/izouma/zhumj/repo/sale/CustomerRepo.java

@@ -24,7 +24,7 @@ public interface CustomerRepo extends JpaRepository<Customer, Long>, JpaSpecific
 
     List<Customer> findAllByCreatedAtBetween(LocalDateTime startDate, LocalDateTime endDate);
 
-    @Query("select c.customerNumber from Customer c where id in (select max(id) from Customer)")
+    @Query("select c.customerNumber from Customer c where c.id in (select max(id) from Customer)")
     String findLastOneCustomerNumber();
 
     @Query("update Customer c set c.renewals = c.renewals+1 where c.id=?1")
@@ -32,7 +32,7 @@ public interface CustomerRepo extends JpaRepository<Customer, Long>, JpaSpecific
     @Transactional
     int addRenewal(Long id);
 
-    @Query("select count(id) from Customer c where coFullName = ?1 ")
+    @Query("select count(c.id) from Customer c where c.coFullName = ?1 ")
     Integer findCoFullNameExit(String coFullName);
 
     @Query("SELECT count(id) from Customer  where saleId = ?1")

+ 20 - 1
src/main/java/com/izouma/zhumj/service/StoreNoticeService.java

@@ -1,6 +1,7 @@
 package com.izouma.zhumj.service;
 
 import com.alibaba.fastjson.JSONObject;
+import com.izouma.zhumj.config.Constants;
 import com.izouma.zhumj.domain.StoreNotice;
 import com.izouma.zhumj.domain.sale.Contract;
 import com.izouma.zhumj.domain.sale.ContractRoom;
@@ -8,6 +9,7 @@ import com.izouma.zhumj.domain.sale.ContractStore;
 import com.izouma.zhumj.enums.CheckInType;
 import com.izouma.zhumj.enums.StoreNoticeStatus;
 import com.izouma.zhumj.enums.StoreNoticeType;
+import com.izouma.zhumj.event.ContractUpdateEvent;
 import com.izouma.zhumj.event.NewContractEvent;
 import com.izouma.zhumj.exception.BusinessException;
 import com.izouma.zhumj.repo.CheckinInfoRepo;
@@ -69,7 +71,7 @@ public class StoreNoticeService {
             lastContract = contractRepo.findByContractNumber(contract.getFirstContractNumber());
         }
         if (lastContract == null) {
-            if (contract.getContractBeginTime().isBefore(LocalDateTime.now())) {
+            if (contract.getContractBeginTime().isBefore(LocalDate.now().atTime(Constants.TIME_MAX))) {
                 return;
             }
             for (ContractStore contractStore : contract.getContractStoreList()) {
@@ -118,6 +120,23 @@ public class StoreNoticeService {
         }
     }
 
+    @EventListener
+    public void onContractUpdate(ContractUpdateEvent event) {
+        Contract oldContract = event.getOldContract();
+        Contract newContract = event.getNewContract();
+        for (ContractStore contractStore : oldContract.getContractStoreList()) {
+            boolean remove = newContract.getContractStoreList().stream()
+                    .map(ContractStore::getStoreId).noneMatch(contractStore.getStoreId()::equals);
+            if (remove) {
+                storeNoticeRepo.deleteByContractIdAndStoreId(oldContract.getId(), contractStore.getStoreId());
+            }
+        }
+
+        if (newContract.getContractBeginTime().isAfter(LocalDate.now().atTime(Constants.TIME_MAX))) {
+            onNewContract(new NewContractEvent(this, newContract));
+        }
+    }
+
     public void done(Long id) {
         StoreNotice storeNotice = storeNoticeRepo.findById(id).orElseThrow(new BusinessException("无记录"));
         if (storeNotice.getStoreNoticeType() == StoreNoticeType.RENEWAL) {

+ 13 - 0
src/main/java/com/izouma/zhumj/service/sale/ContractContactService.java

@@ -0,0 +1,13 @@
+package com.izouma.zhumj.service.sale;
+
+import com.izouma.zhumj.repo.sale.ContractContactRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+@AllArgsConstructor
+public class ContractContactService {
+    private ContractContactRepo contractContactRepo;
+
+}

+ 0 - 14
src/main/java/com/izouma/zhumj/service/sale/ContractContactsService.java

@@ -1,14 +0,0 @@
-package com.izouma.zhumj.service.sale;
-
-import com.izouma.zhumj.domain.sale.ContractContacts;
-import com.izouma.zhumj.repo.sale.ContractContactsRepo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-@Service
-public class ContractContactsService {
-
-    @Autowired
-    private ContractContactsRepo contractContactsRepo;
-
-}

+ 52 - 55
src/main/java/com/izouma/zhumj/service/sale/ContractService.java

@@ -9,6 +9,7 @@ import com.izouma.zhumj.dto.ContractCheckinInfo;
 import com.izouma.zhumj.dto.sale.StoreContractDTO;
 import com.izouma.zhumj.enums.BillStatus;
 import com.izouma.zhumj.enums.CheckInType;
+import com.izouma.zhumj.event.ContractUpdateEvent;
 import com.izouma.zhumj.event.NewContractEvent;
 import com.izouma.zhumj.exception.BusinessException;
 import com.izouma.zhumj.repo.*;
@@ -16,6 +17,8 @@ import com.izouma.zhumj.repo.sale.*;
 import com.izouma.zhumj.utils.ObjUtils;
 import com.izouma.zhumj.utils.ThreadTask;
 import lombok.AllArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.context.ApplicationContext;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageImpl;
@@ -23,13 +26,11 @@ import org.springframework.data.domain.Pageable;
 import org.springframework.data.jpa.domain.Specification;
 import org.springframework.stereotype.Service;
 import org.springframework.util.ObjectUtils;
-import org.springframework.util.StringUtils;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 @Service
@@ -50,22 +51,22 @@ public class ContractService {
     private StoreNoticeRepo    storeNoticeRepo;
 
     public Contract save(Contract record) {
-        Contract save;
-        boolean syn = true;
+        boolean createNew = true;
         boolean renewal = false;
         if (record.getCheckInType().equals(CheckInType.INDIVIDUAL) || record.getCheckInType()
                 .equals(CheckInType.TEAM_POST_PAID)) {
             record.setBedsAmount(10000);
         }
+        Contract oldContract = null;
         if (record.getId() != null) {
             Contract orig = contractRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
+            oldContract = new Contract();
+            BeanUtils.copyProperties(orig, oldContract);
+            //BeanUtils无法复制被jpa代理的字段
+            oldContract.setContractStoreList(new ArrayList<>(orig.getContractStoreList()));
             ObjUtils.merge(orig, record);
-            syn = false;
+            createNew = false;
         } else {
-            Contract byContractNumber = contractRepo.findByContractNumber(record.getContractNumber());
-            if (!ObjectUtils.isEmpty(byContractNumber)) {
-                throw new BusinessException("合同编号已存在");
-            }
             if (!StringUtils.isEmpty(record.getFirstContractNumber())) {
                 renewal = true;
             }
@@ -88,70 +89,61 @@ public class ContractService {
         }
         List<ContractRoom> roomList = new ArrayList<>();
         //设置房型信息存储
-        AtomicReference<Integer> bedAmount = new AtomicReference<>(0);
-
-        bedAmount.set(0);
-
-
-        boolean finalRenewal = renewal;
-        record.getContractStoreList().forEach(contractStore -> {
+        int bedAmount = 0;
 
-            if (finalRenewal) {
+        for (ContractStore contractStore : record.getContractStoreList()) {
+            if (renewal) {
                 contractStore.setLastId(contractStore.getId());
                 contractStore.setId(null);
             }
 
             contractStore.setContractNumber(record.getContractNumber());
-            contractStore.getRoomList().forEach(room -> {
-                if (finalRenewal) {
-                    room.setLastId(room.getId());
-                    room.setId(null);
+            for (ContractRoom contractRoom : contractStore.getRoomList()) {
+                if (renewal) {
+                    contractRoom.setLastId(contractRoom.getId());
+                    contractRoom.setId(null);
                 }
-                room.setStoreInfoId(contractStore.getStoreId());
-                room.setContractNumber(record.getContractNumber());
-                bedAmount.set(bedAmount.get() + room.getBeds());
-
-            });
+                contractRoom.setStoreInfoId(contractStore.getStoreId());
+                contractRoom.setContractNumber(record.getContractNumber());
+                bedAmount += contractRoom.getBeds();
+            }
             roomList.addAll(contractStore.getRoomList());
-        });
+        }
 
-        record.getContactsList().forEach(contacts -> {
-            if (finalRenewal) {
-                contacts.setId(null);
+        for (ContractContact contact : record.getContactList()) {
+            if (renewal) {
+                contact.setId(null);
             }
-            contacts.setContractNumber(record.getContractNumber());
-        });
-
-        record.getCycles().forEach(cycle -> {
-            if (finalRenewal) {
+            contact.setContractNumber(record.getContractNumber());
+        }
 
+        for (ContractCycle cycle : record.getCycles()) {
+            if (renewal) {
                 cycle.setId(null);
             }
             cycle.setContractNumber(record.getContractNumber());
             cycle.setSaleId(record.getSaleId());
             cycle.setCustomerId(record.getCustomerId());
-        });
+        }
 
-        record.getRoomList().forEach(room -> {
-            if (finalRenewal) {
-                room.setLastId(room.getId());
-                room.setId(null);
-                room.setId(null);
+        for (ContractRoom contractRoom : record.getRoomList()) {
+            if (renewal) {
+                contractRoom.setLastId(contractRoom.getId());
+                contractRoom.setId(null);
             }
-            room.setContractNumber(record.getContractNumber());
-        });
+            contractRoom.setContractNumber(record.getContractNumber());
+        }
 
         record.setRoomList(roomList);
+        record.setBedsAmount(bedAmount);
 
-        record.setBedsAmount(bedAmount.get());
-
-        save = contractRepo.save(record);
+        record = contractRepo.save(record);
         //如果是团散直接添加合同人员信息
         if (record.getCheckInType().equals(CheckInType.INDIVIDUAL)) {
-            if (!ObjectUtils.isEmpty(record.getContactsList())) {
-                for (ContractContacts contact : record.getContactsList()) {
+            if (!ObjectUtils.isEmpty(record.getContactList())) {
+                for (ContractContact contact : record.getContactList()) {
                     ContractStaff staff = new ContractStaff();
-                    staff.setContractId(save.getId());
+                    staff.setContractId(record.getId());
                     staff.setName(contact.getName());
                     staff.setIdNo(contact.getIdNo());
                     staff.setPhone(contact.getMobile());
@@ -159,17 +151,22 @@ public class ContractService {
                 }
             }
         }
-        if (syn) {
-            ThreadTask.getInstance().addTask(() -> customerService.SynchronizeContract(record.getContractNumber()));
+        if (createNew) {
+            Contract finalRecord = record;
+            ThreadTask.getInstance()
+                    .addTask(() -> customerService.syncContract(finalRecord));
 //            ThreadTask.getInstance().addTask(() -> saleTargetService.SynchronizeContract(record.getContractNumber()));
         }
-        if (finalRenewal) {
+        if (renewal) {
             customerRepo.addRenewal(record.getCustomerId());
             contractRepo.addRenewal(record.getContractNumber());
-
         }
-        applicationContext.publishEvent(new NewContractEvent(this, save));
-        return save;
+        if (createNew) {
+            applicationContext.publishEvent(new NewContractEvent(this, record));
+        } else {
+            applicationContext.publishEvent(new ContractUpdateEvent(this, oldContract, record));
+        }
+        return record;
     }
 
     public void delete(Long id) {

+ 11 - 24
src/main/java/com/izouma/zhumj/service/sale/CustomerService.java

@@ -1,6 +1,7 @@
 package com.izouma.zhumj.service.sale;
 
 import com.izouma.zhumj.domain.sale.Contract;
+import com.izouma.zhumj.domain.sale.ContractRoom;
 import com.izouma.zhumj.domain.sale.Customer;
 import com.izouma.zhumj.enums.CustomerStatus;
 import com.izouma.zhumj.exception.BusinessException;
@@ -74,32 +75,17 @@ public class CustomerService {
     /**
      * 根据合同信息同步客户管理信息
      *
-     * @param contractNumber 合同编号
+     * @param contract 合同
      */
-    public void SynchronizeContract(String contractNumber) {
+    public void syncContract(Contract contract) {
         try {
-            log.info("合同{},同步客户管理信息", contractNumber);
-            Contract contract = contractRepo.findByContractNumber(contractNumber);
-            boolean empty = ObjectUtils.isEmpty(contract);
-            if (empty) {
-                log.info("合同{},不存在异常信息", contractNumber);
-                return;
-            }
-            //查询客户管理信息
-            Customer customer = customerRepo.findById(contract.getCustomerId()).orElseThrow(new BusinessException("无客户记录同步异常"));
-            //如果没有当前用户信息
-            if (ObjectUtils.isEmpty(customer)) {
-                customer = new Customer();
-                customer.setSaleId(contract.getSaleId());
-                customer.setSaleName(contract.getSaleName());
-            }
+            Customer customer = customerRepo.findById(contract.getCustomerId())
+                    .orElseThrow(new BusinessException("无客户记录同步异常"));
             customer.synchronizeContractInfo(contract);
-            AtomicReference<Integer> roomAmount = new AtomicReference<>(0);
-            contract.getRoomList().stream().forEach(room -> {
-                roomAmount.set(roomAmount.get() + room.getBeds());
-            });
-            customer.setMonthlyOfBed(customer.getMonthlyOfBed() + roomAmount.get());
-            customer.setBedAmount(customer.getBedAmount() + roomAmount.get());
+            int bedAmount = contract.getRoomList().stream().map(ContractRoom::getBeds).reduce(Integer::sum).orElse(0);
+            //todo 每月床位数统计方法不对
+            customer.setMonthlyOfBed(customer.getMonthlyOfBed() + bedAmount);
+            customer.setBedAmount(customer.getBedAmount() + bedAmount);
             customer.setIntention(CustomerStatus.FORMAL.toString());
             save(customer);
             //同步销售统计
@@ -150,7 +136,8 @@ public class CustomerService {
     public List<Customer> allByStoreId(Long storeId) {
 
         Set<String> contractNumbers = contractStoreRepo.findAllContractNumberByStoreId(storeId);
-        List<Contract> contractList = contractRepo.findAllByContractNumberInAndContractEndTimeAfter(contractNumbers, LocalDateTime.now());
+        List<Contract> contractList = contractRepo.findAllByContractNumberInAndContractEndTimeAfter(contractNumbers, LocalDateTime
+                .now());
 
         List<Customer> customerList = new ArrayList<>();
 

+ 4 - 4
src/main/java/com/izouma/zhumj/service/sale/SaleWorkService.java

@@ -229,7 +229,7 @@ public class SaleWorkService {
                             .roomIfo(splicingRoomInfo(contract.getRoomList()))
                             .payType("押" + contract.getBet() + "付" + contract.getPay())
                             .contactAddress(contract.getContactAddress())
-                            .contacts(splicingContacts(contract.getContactsList()))
+                            .contacts(splicingContacts(contract.getContactList()))
                             .build()
             );
         });
@@ -338,12 +338,12 @@ public class SaleWorkService {
     /**
      * 拼接联系人信息
      *
-     * @param contactsList
+     * @param contactList
      * @return
      */
-    public String splicingContacts(List<ContractContacts> contactsList) {
+    public String splicingContacts(List<ContractContact> contactList) {
         AtomicReference<String> contactsStr = new AtomicReference<>("");
-        contactsList.stream().forEach(contacts -> {
+        contactList.stream().forEach(contacts -> {
             String s = "["
                     + "姓名:" + contacts.getName() + ","
                     + "电话:" + contacts.getMobile() + "]";

+ 62 - 0
src/main/java/com/izouma/zhumj/web/sale/ContractContactController.java

@@ -0,0 +1,62 @@
+package com.izouma.zhumj.web.sale;
+
+import com.izouma.zhumj.domain.sale.ContractContact;
+import com.izouma.zhumj.web.BaseController;
+import com.izouma.zhumj.service.sale.ContractContactService;
+import com.izouma.zhumj.dto.PageQuery;
+import com.izouma.zhumj.exception.BusinessException;
+import com.izouma.zhumj.repo.sale.ContractContactRepo;
+import com.izouma.zhumj.utils.ObjUtils;
+import com.izouma.zhumj.utils.excel.ExcelUtils;
+
+import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.util.List;
+
+@RestController
+@RequestMapping("/contractContact")
+@AllArgsConstructor
+public class ContractContactController extends BaseController {
+    private ContractContactService contractContactService;
+    private ContractContactRepo    contractContactRepo;
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/save")
+    public ContractContact save(@RequestBody ContractContact record) {
+        if (record.getId() != null) {
+            ContractContact orig = contractContactRepo.findById(record.getId())
+                    .orElseThrow(new BusinessException("无记录"));
+            ObjUtils.merge(orig, record);
+            return contractContactRepo.save(record);
+        }
+        return contractContactRepo.save(record);
+    }
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @GetMapping("/all")
+    public Page<ContractContact> all(PageQuery pageQuery) {
+        return contractContactRepo.findAll(toSpecification(pageQuery, ContractContact.class), toPageRequest(pageQuery));
+    }
+
+    @GetMapping("/get/{id}")
+    public ContractContact get(@PathVariable Long id) {
+        return contractContactRepo.findById(id).orElseThrow(new BusinessException("无记录"));
+    }
+
+    @PostMapping("/del/{id}")
+    public void del(@PathVariable Long id) {
+        contractContactRepo.deleteById(id);
+    }
+
+    @GetMapping("/excel")
+    @ResponseBody
+    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
+        List<ContractContact> data = all(pageQuery).getContent();
+        ExcelUtils.export(response, data);
+    }
+}
+

+ 0 - 69
src/main/java/com/izouma/zhumj/web/sale/ContractContactsController.java

@@ -1,69 +0,0 @@
-package com.izouma.zhumj.web.sale;
-
-import com.izouma.zhumj.web.BaseController;
-import com.izouma.zhumj.domain.sale.ContractContacts;
-import com.izouma.zhumj.service.sale.ContractContactsService;
-import com.izouma.zhumj.dto.PageQuery;
-import com.izouma.zhumj.exception.BusinessException;
-import com.izouma.zhumj.repo.sale.ContractContactsRepo;
-import com.izouma.zhumj.utils.ObjUtils;
-import com.izouma.zhumj.utils.excel.ExcelUtils;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.data.domain.Page;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.List;
-
-@RestController
-@RequestMapping("/contractContacts")
-public class ContractContactsController extends BaseController {
-    /*generatedStart*/
-    @Autowired
-    private ContractContactsService contractContactsService;
-
-    @Autowired
-    private ContractContactsRepo contractContactsRepo;
-    /*generatedEnd*/
-
-    /*generatedStart*/
-    //@PreAuthorize("hasRole('ADMIN')")
-    @PostMapping("/save")
-    public ContractContacts save(@RequestBody ContractContacts record) {
-        if (record.getId() != null) {
-            ContractContacts orig = contractContactsRepo.findById(record.getId()).orElseThrow(new BusinessException("无记录"));
-            ObjUtils.merge(orig, record);
-            return contractContactsRepo.save(record);
-        }
-        return contractContactsRepo.save(record);
-    }
-
-
-    //@PreAuthorize("hasRole('ADMIN')")
-    @GetMapping("/all")
-    public Page<ContractContacts> all(PageQuery pageQuery) {
-        return contractContactsRepo.findAll(toSpecification(pageQuery,ContractContacts.class), toPageRequest(pageQuery));
-    }
-
-    @GetMapping("/get/{id}")
-    public ContractContacts get(@PathVariable Long id) {
-        return contractContactsRepo.findById(id).orElseThrow(new BusinessException("无记录"));
-    }
-
-    @PostMapping("/del/{id}")
-    public void del(@PathVariable Long id) {
-        contractContactsRepo.deleteById(id);
-    }
-
-    @GetMapping("/excel")
-    @ResponseBody
-    public void excel(HttpServletResponse response, PageQuery pageQuery) throws IOException {
-        List<ContractContacts> data = all(pageQuery).getContent();
-        ExcelUtils.export(response, data);
-    }
-    /*generatedEnd*/
-}
-

+ 8 - 8
src/main/vue/src/components/ResidenceData.vue

@@ -253,7 +253,7 @@ export default {
                 bet: 1,
                 checkInType: 'TEAM',
                 cycles: [],
-                contactsList: [],
+                contactList: [],
                 contractStoreList: [
                     {
                         deductions: [],
@@ -398,9 +398,9 @@ export default {
                     .get(`/contract/get/${this.residenceData.contractId}`)
                     .then(res => {
                         this.getUser();
-                        if (!res.contactsList) {
+                        if (!res.contactList) {
                             res.push({
-                                contactsList: [
+                                contactList: [
                                     {
                                         name: '',
                                         mobile: ''
@@ -769,19 +769,19 @@ export default {
         removeContacts(item) {
             if (item.id) {
                 this.$http
-                    .post('/contractContacts/del/' + item.id)
+                    .post('/contractContact/del/' + item.id)
                     .then(res => {})
                     .catch(e => {
                         this.$message.error(e.error);
                     });
             }
-            var index = this.formData.contactsList.indexOf(item);
+            var index = this.formData.contactList.indexOf(item);
             if (index !== -1) {
-                this.formData.contactsList.splice(index, 1);
+                this.formData.contactList.splice(index, 1);
             }
         },
-        addContacts() {
-            this.formData.contactsList.push({
+        addContact() {
+            this.formData.contactList.push({
                 name: '',
                 mobile: '',
                 idNo: ''

+ 3 - 3
src/main/vue/src/router.js

@@ -569,10 +569,10 @@ const router = new Router({
                     }
                 },
                 {
-                    path: '/contractContactsList',
-                    name: 'ContractContactsList',
+                    path: '/contractContactList',
+                    name: 'ContractContactList',
                     component: () =>
-                        import(/* webpackChunkName: "saleParamConfigEdit" */ '@/views/sale/ContractContactsList.vue')
+                        import(/* webpackChunkName: "contractContactList" */ '@/views/sale/ContractContactList.vue')
                 },
                 {
                     path: '/depositRefundApplyEdit',

+ 6 - 0
src/main/vue/src/views/Operation/RoomStatus.vue

@@ -569,6 +569,7 @@
                         v-model="checkInForm.depositAmount"
                         :min="0"
                         label="请输入入住押金金额"
+                        :disabled="!!checkInForm.nobody"
                     ></el-input-number>
                 </el-form-item>
 
@@ -1858,6 +1859,11 @@ export default {
                         this.$message.error(e.error);
                     });
             }
+        },
+        'checkInForm.nobody'(val) {
+            if (val) {
+                this.$set(this.checkInForm, 'depositAmount', 0);
+            }
         }
     },
     created() {

+ 5 - 14
src/main/vue/src/views/sale/ContractContactsList.vue → src/main/vue/src/views/sale/ContractContactList.vue

@@ -45,7 +45,6 @@
             </el-table-column>
             <el-table-column label="操作" align="center" v-if="canEdit" fixed="right" min-width="150">
                 <template slot-scope="{ row }">
-                    <el-button @click="editRow(row)" type="primary" size="mini" plain>编辑</el-button>
                     <el-button @click="deleteRow(row)" type="danger" size="mini" plain>删除</el-button>
                 </template>
             </el-table-column>
@@ -70,7 +69,7 @@ import { mapState } from 'vuex';
 import pageableTable from '@/mixins/pageableTable';
 
 export default {
-    name: 'ContractContactsList',
+    name: 'ContractContactList',
     mixins: [pageableTable],
     created() {
         this.getData();
@@ -79,7 +78,7 @@ export default {
         return {
             multipleMode: false,
             search: '',
-            url: '/contractContacts/all',
+            url: '/contractContact/all',
             downloading: false
         };
     },
@@ -102,24 +101,16 @@ export default {
         },
         addRow() {
             this.$router.push({
-                path: '/contractContactsEdit',
+                path: '/contractContactEdit',
                 query: {
                     ...this.$route.query
                 }
             });
         },
-        editRow(row) {
-            this.$router.push({
-                path: '/contractContactsEdit',
-                query: {
-                    id: row.id
-                }
-            });
-        },
         download() {
             this.downloading = true;
             this.$axios
-                .get('/contractContacts/excel', { responseType: 'blob' })
+                .get('/contractContact/excel', { responseType: 'blob' })
                 .then(res => {
                     console.log(res);
                     this.downloading = false;
@@ -149,7 +140,7 @@ export default {
         deleteRow(row) {
             this.$alert('删除将无法恢复,确认要删除么?', '警告', { type: 'error' })
                 .then(() => {
-                    return this.$http.post(`/contractContacts/del/${row.id}`);
+                    return this.$http.post(`/contractContact/del/${row.id}`);
                 })
                 .then(() => {
                     this.$message.success('删除成功');

+ 16 - 16
src/main/vue/src/views/sale/ContractEdit.vue

@@ -247,29 +247,29 @@
                 <div class="stepInfo" style="width:520px">
                     <el-form
                         :inline="true"
-                        v-for="(contacts, index) in formData.contactsList"
+                        v-for="(contact, index) in formData.contactList"
                         :key="index"
                         class="demo-form-inline"
                     >
                         <el-form-item :label="'联系人' + (index + 1)"> </el-form-item>
                         <el-form-item label="姓名">
-                            <el-input placeholder="联系人姓名" v-model="contacts.name" style="width:120px"> </el-input>
+                            <el-input placeholder="联系人姓名" v-model="contact.name" style="width:120px"> </el-input>
                         </el-form-item>
                         <el-form-item label="电话">
-                            <el-input placeholder="联系人电话号码" v-model="contacts.mobile" style="width:150px">
+                            <el-input placeholder="联系人电话号码" v-model="contact.mobile" style="width:150px">
                             </el-input>
                         </el-form-item>
                         <el-form-item v-if="formData.checkInType == 'INDIVIDUAL'"> </el-form-item>
                         <el-form-item label="身份证号" v-if="formData.checkInType == 'INDIVIDUAL'">
-                            <el-input placeholder="联系人身份证号" v-model="contacts.idNo" style="width:150px">
+                            <el-input placeholder="联系人身份证号" v-model="contact.idNo" style="width:150px">
                             </el-input>
                         </el-form-item>
                         <el-form-item>
-                            <el-button type="danger" @click.prevent="removeContacts(contacts)">删除 </el-button>
+                            <el-button type="danger" @click.prevent="removeContact(contact)">删除 </el-button>
                         </el-form-item>
                     </el-form>
                 </div>
-                <el-button type="primary" plain @click="addContacts">新增联系人 </el-button>
+                <el-button type="primary" plain @click="addContact">新增联系人 </el-button>
             </el-form-item>
             <el-form-item prop="contactAddress" label="联系地址">
                 <el-input v-model="formData.contactAddress" style="width:215px"> </el-input>
@@ -365,9 +365,9 @@ export default {
                         this.customerOptions = [res];
                         this.brandOptions = res.brands;
                     });
-                    if (!res.contactsList) {
+                    if (!res.contactList) {
                         res.push({
-                            contactsList: [
+                            contactList: [
                                 {
                                     name: '',
                                     mobile: ''
@@ -426,7 +426,7 @@ export default {
                 bet: 1,
                 checkInType: 'TEAM',
                 cycles: [],
-                contactsList: [],
+                contactList: [],
                 contractStoreList: [
                     {
                         deductions: [],
@@ -610,7 +610,7 @@ export default {
             this.formData.brandId = '';
             console.log(customer);
 
-            this.formData.contactsList.push({
+            this.formData.contactList.push({
                 name: customer.name,
                 mobile: customer.mobile
             });
@@ -932,22 +932,22 @@ export default {
         /**
          * 联系人添加
          */
-        removeContacts(item) {
+        removeContact(item) {
             if (item.id) {
                 this.$http
-                    .post('/contractContacts/del/' + item.id)
+                    .post('/contractContact/del/' + item.id)
                     .then(res => {})
                     .catch(e => {
                         this.$message.error(e.error);
                     });
             }
-            var index = this.formData.contactsList.indexOf(item);
+            var index = this.formData.contactList.indexOf(item);
             if (index !== -1) {
-                this.formData.contactsList.splice(index, 1);
+                this.formData.contactList.splice(index, 1);
             }
         },
-        addContacts() {
-            this.formData.contactsList.push({
+        addContact() {
+            this.formData.contactList.push({
                 name: '',
                 mobile: '',
                 idNo: ''

+ 0 - 1167
src/main/vue/src/views/sale/ContractEditBak.vue

@@ -1,1167 +0,0 @@
-<template>
-    <div class="edit-view">
-        <el-form
-            :model="formData"
-            :rules="rules"
-            ref="form"
-            label-width="120px"
-            label-position="right"
-            size="small"
-            style="max-width:810px;"
-        >
-            <el-form-item prop="contractNumber" label="合同编号">
-                <el-input v-model="formData.contractNumber" style="width:215px"> </el-input>
-            </el-form-item>
-
-            <el-form-item prop="checkInType-+9899" label="合作模式">
-                <el-select v-model="formData.checkInType">
-                    <el-option
-                        v-for="(item, index) in CustomerCooperationType"
-                        :key="index"
-                        :label="item.label"
-                        :value="item.value"
-                    >
-                    </el-option>
-                </el-select>
-            </el-form-item>
-
-            <el-form-item prop="storeInfoId" label="公司" v-if="this.formData.checkInType != 'INDIVIDUAL'">
-                <el-select filterable v-model="formData.customerId">
-                    <el-option
-                        v-for="(item, index) in customerInfo"
-                        :key="index"
-                        :label="item.coSimpleName + '(' + item.coFullName + ')'"
-                        :value="item.id"
-                    >
-                    </el-option>
-                </el-select>
-            </el-form-item>
-
-            <el-form-item label="门店信息">
-                <div
-                    class="stepInfo"
-                    v-for="(contractFree, index) in formData.contractStoreList"
-                    :key="index"
-                    style="width:360px"
-                >
-                    <div class="step-title">门店{{ index + 1 }}</div>
-                    <div class="btnList">
-                        <el-button type="danger" @click.prevent="removeContractFree(contractFree)" size="mini"
-                            >删除该门店
-                        </el-button>
-                    </div>
-
-                    <el-form label-width="80px" label-position="left">
-                        <el-form-item class="form-item" label="门店名称">
-                            <el-select
-                                filterable
-                                v-model="contractFree.storeId"
-                                @change="getRoomTyeInfo(contractFree, index)"
-                            >
-                                <el-option
-                                    v-for="(item, index) in storeInfo"
-                                    :key="index"
-                                    :label="item.storeName"
-                                    :value="item.id"
-                                >
-                                </el-option>
-                            </el-select>
-                        </el-form-item>
-
-                        <el-form-item class="form-item" label="减免类型">
-                            <el-select
-                                v-model="contractFree.personalFeeTypes"
-                                multiple
-                                filterable
-                                placeholder="请选择"
-                                value-key="id"
-                                style="width:215px"
-                            >
-                                <el-option
-                                    v-for="item in getPersonalFeeTypes(contractFree.storeId)"
-                                    :key="item.id"
-                                    :label="item.name"
-                                    :value="item"
-                                >
-                                </el-option>
-                            </el-select>
-                        </el-form-item>
-
-                        <el-form-item
-                            prop="monthlyRent"
-                            label="月租金"
-                            v-if="formData.checkInType == 'INDIVIDUAL' || formData.checkInType == 'TEAM_POST_PAID'"
-                        >
-                            <el-input-number type="number" v-model="contractFree.monthlyRent"> </el-input-number>
-                        </el-form-item>
-
-                        <el-form-item
-                            prop="monthlyRent"
-                            label="日租金"
-                            v-if="formData.checkInType == 'INDIVIDUAL' || formData.checkInType == 'TEAM_POST_PAID'"
-                        >
-                            <el-input-number type="number" v-model="contractFree.dayRent"> </el-input-number>
-                        </el-form-item>
-
-                        <el-form-item
-                            prop="monthlyRent"
-                            label="日租金最大天数"
-                            v-if="formData.checkInType == 'INDIVIDUAL' || formData.checkInType == 'TEAM_POST_PAID'"
-                        >
-                            <el-input-number type="number" v-model="contractFree.daySize"> </el-input-number>
-                        </el-form-item>
-
-                        <el-form-item
-                            class="form-item"
-                            label="选择房间"
-                            v-if="formData.checkInType == 'TEAM' || formData.checkInType == 'SCATTERED_BEDS'"
-                        >
-                            <el-select
-                                v-model="contractFree.contractRoomInfoList"
-                                multiple
-                                filterable
-                                placeholder="请选择"
-                                value-key="id"
-                                style="width:215px"
-                            >
-                                <el-option
-                                    v-for="item in getContractRoomInfoList(contractFree.storeId)"
-                                    :key="item.id"
-                                    :label="item.roomName"
-                                    :value="item"
-                                >
-                                </el-option>
-                            </el-select>
-                        </el-form-item>
-
-                        <el-form-item
-                            label="房型信息"
-                            v-if="formData.checkInType == 'TEAM' || formData.checkInType == 'SCATTERED_BEDS'"
-                        >
-                            <div class="houseInfo" v-for="(room, index) in contractFree.roomList" :key="index">
-                                <div class="step-title">房型{{ index + 1 }}</div>
-                                <div class="btnList">
-                                    <el-button
-                                        size="mini"
-                                        type="danger"
-                                        @click.prevent="removeRoom(contractFree, room)"
-                                    >
-                                        删除该房型
-                                    </el-button>
-                                </div>
-
-                                <el-form-item label="房间类型" class="form-item">
-                                    <el-select filterable v-model="room.roomTypeId">
-                                        <el-option
-                                            v-for="(item, index) in contractFree.roomTypeInfo"
-                                            :key="index"
-                                            :label="item.typeName"
-                                            :value="item.id"
-                                        >
-                                        </el-option>
-                                    </el-select>
-                                </el-form-item>
-
-                                <el-form-item label="床位数" class="form-item">
-                                    <el-input-number type="number" v-model="room.beds"> </el-input-number>
-                                </el-form-item>
-
-                                <el-form-item label="单价" class="form-item">
-                                    <el-input-number type="number" v-model="room.price"> </el-input-number>
-                                </el-form-item>
-                            </div>
-
-                            <el-button type="primary" plain @click="addRoom(contractFree)">新增房型 </el-button>
-                        </el-form-item>
-                    </el-form>
-                </div>
-
-                <el-button type="primary" plain @click="addContractFree">新增门店 </el-button>
-            </el-form-item>
-
-            <el-form-item
-                prop="bedsAmount"
-                label="合同人数"
-                v-if="this.formData.checkInType == 'INDIVIDUAL' || this.formData.checkInType == 'TEAM_POST_PAID'"
-            >
-                <el-input-number type="number" v-model="formData.bedsAmount"> </el-input-number>
-            </el-form-item>
-
-            <el-form-item
-                prop="monthlyRent"
-                label="月租金"
-                v-if="formData.checkInType == 'TEAM' || formData.checkInType == 'SCATTERED_BEDS'"
-            >
-                <el-input-number type="number" v-model="formData.monthlyRent"> </el-input-number>
-            </el-form-item>
-            <el-form-item prop="contractDays" label="合同期(月)">
-                <el-input-number type="number" v-model="formData.contractMonthly"> </el-input-number>
-            </el-form-item>
-            <el-form-item
-                prop="contractTotalRent"
-                label="合同总租金"
-                v-if="formData.checkInType == 'TEAM' || formData.checkInType == 'SCATTERED_BEDS'"
-            >
-                <el-input-number type="number" v-model="formData.contractTotalRent"></el-input-number>
-            </el-form-item>
-            <el-form-item prop="contractBeginTime" label="合同开始时间">
-                <el-date-picker
-                    v-model="formData.contractBeginTime"
-                    type="datetime"
-                    value-format="yyyy-MM-dd HH:mm:ss"
-                    placeholder="选择日期时间"
-                >
-                </el-date-picker>
-            </el-form-item>
-            <el-form-item prop="contractEndTime" label="合同结束时间">
-                <el-date-picker
-                    v-model="formData.contractEndTime"
-                    type="datetime"
-                    value-format="yyyy-MM-dd HH:mm:ss"
-                    placeholder="选择日期时间"
-                    @change="getContractDays"
-                >
-                </el-date-picker>
-            </el-form-item>
-            <el-form-item prop="contractDays" label="合同期(天)">
-                <el-input-number disabled type="number" v-model="formData.contractDays"> </el-input-number>
-            </el-form-item>
-            <el-form-item prop="flowBet" label="散客押金">
-                <el-input-number type="number" v-model="formData.flowBet"> </el-input-number>
-            </el-form-item>
-            <el-form-item
-                prop="PayType"
-                label="付款方式"
-                v-if="formData.checkInType == 'TEAM' || formData.checkInType == 'SCATTERED_BEDS'"
-            >
-                <el-input v-model="formData.bet" style="width:130px" disabled>
-                    <template slot="prepend">押</template>
-                </el-input>
-                <el-input v-model="formData.pay" style="width:130px;margin-left:10px">
-                    <template slot="prepend">付</template>
-                </el-input>
-            </el-form-item>
-            <el-form-item>
-                <el-button type="success" round @click="cycleGen" v-if="!showCycle">
-                    生成账单
-                </el-button>
-            </el-form-item>
-            <el-form-item label="付款周期" v-if="showCycle">
-                <div class="stepInfo">
-                    <el-form
-                        :inline="true"
-                        v-for="(cycle, index) in formData.cycles"
-                        :key="index"
-                        class="demo-form-inline"
-                    >
-                        <el-form-item :label="'周期' + (index + 1)"> </el-form-item>
-                        <el-form-item> </el-form-item>
-
-                        <!--                        <el-form-item prop="cycle" label="周期">-->
-                        <!--                            <el-input-number type="number" v-model="cycle.cycle" disable></el-input-number>-->
-                        <!--                        </el-form-item>-->
-
-                        <el-form-item prop="cycleEndTime" label="时间节点">
-                            <el-date-picker
-                                v-model="cycle.cycleEndTime"
-                                type="datetime"
-                                value-format="yyyy-MM-dd HH:mm:ss"
-                                placeholder="选择日期时间"
-                            >
-                            </el-date-picker>
-                        </el-form-item>
-                        <el-form-item prop="cycleMoney" label="收款金额">
-                            <el-input-number type="number" v-model="cycle.cycleMoney"></el-input-number>
-                        </el-form-item>
-                        <el-form-item>
-                            <el-button type="danger" @click.prevent="removeCycle(cycle)">删除 </el-button>
-                        </el-form-item>
-                    </el-form>
-                </div>
-                <el-button type="primary" plain @click="addCycle">新增周期 </el-button>
-            </el-form-item>
-
-            <el-form-item prop="contractRenewals" label="续约次数">
-                <el-input-number type="number" v-model="formData.contractRenewals"></el-input-number>
-            </el-form-item>
-            <el-form-item prop="departmentName" label="销售部门">
-                <el-input disabled v-model="formData.departmentName" style="width:215px"></el-input>
-            </el-form-item>
-            <el-form-item prop="saleName" label="销售员">
-                <el-select filterable v-model="formData.saleId" :disabled="saleEdit" @change="changeSaleName">
-                    <el-option
-                        v-for="(item, index) in saleUser"
-                        :key="index"
-                        :label="item.nickname + '(' + item.departments[0].name + ')'"
-                        :value="item.id"
-                    >
-                    </el-option>
-                </el-select>
-            </el-form-item>
-
-            <!--            <el-form-item prop="departmentId" label="销售员部门id(预留)">-->
-            <!--                <el-input v-model="formData.departmentId"></el-input>-->
-            <!--            </el-form-item>-->
-            <!--            <el-form-item prop="departmentName" label="销售员名称(预留)">-->
-            <!--                <el-input v-model="formData.departmentName"></el-input>-->
-            <!--            </el-form-item>-->
-            <el-form-item prop="customerSource" label="客户来源">
-                <el-select v-model="formData.customerSource">
-                    <el-option v-for="(item, index) in sourceData" :key="index" :label="item.label" :value="item.value">
-                    </el-option>
-                </el-select>
-            </el-form-item>
-            <el-form-item prop="customerIndustry" label="客户行业">
-                <el-input v-model="formData.customerIndustry" style="width:215px"></el-input>
-            </el-form-item>
-
-            <el-form-item label="联系人">
-                <div class="stepInfo" style="width:520px">
-                    <el-form
-                        :inline="true"
-                        v-for="(contacts, index) in formData.contactsList"
-                        :key="index"
-                        class="demo-form-inline"
-                    >
-                        <el-form-item :label="'联系人' + (index + 1)"> </el-form-item>
-                        <el-form-item label="姓名">
-                            <el-input placeholder="联系人姓名" v-model="contacts.name" style="width:120px"> </el-input>
-                        </el-form-item>
-                        <el-form-item label="电话">
-                            <el-input placeholder="联系人电话号码" v-model="contacts.mobile" style="width:150px">
-                            </el-input>
-                        </el-form-item>
-                        <el-form-item>
-                            <el-button type="danger" @click.prevent="removeContacts(contacts)">删除 </el-button>
-                        </el-form-item>
-                    </el-form>
-                </div>
-                <el-button type="primary" plain @click="addContacts">新增联系人 </el-button>
-            </el-form-item>
-            <el-form-item prop="contactAddress" label="联系地址">
-                <el-input v-model="formData.contactAddress" style="width:215px"> </el-input>
-            </el-form-item>
-
-            <el-form-item prop="status" label="状态(在住  已退)">
-                <el-select v-model="formData.status">
-                    <el-option v-for="(item, index) in statusData" :key="index" :label="item.label" :value="item.value">
-                    </el-option>
-                </el-select>
-            </el-form-item>
-
-            <el-form-item prop="enclosure" label="附件">
-                <el-upload
-                    drag
-                    class="single-upload"
-                    :action="uploadUrl"
-                    :show-file-list="true"
-                    :on-success="onSuccess"
-                    :before-upload="beforeUpload"
-                    :limit="1"
-                    multiple
-                >
-                    <div></div>
-                    <i class="el-icon-upload"></i>
-                    <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
-                </el-upload>
-            </el-form-item>
-
-            <el-form-item prop="note" label="备注">
-                <el-input
-                    type="textarea"
-                    placeholder="请输入内容"
-                    v-model="formData.note"
-                    maxlength="200"
-                    show-word-limit
-                >
-                </el-input>
-            </el-form-item>
-            <el-form-item>
-                <el-button @click="onSave" :loading="$store.state.fetchingData" type="primary">保存 </el-button>
-                <el-button @click="onDelete" :loading="$store.state.fetchingData" type="danger" v-if="formData.id"
-                    >删除
-                </el-button>
-                <el-button @click="$router.go(-1)">取消</el-button>
-            </el-form-item>
-        </el-form>
-    </div>
-</template>
-<script>
-import resolveUrl from 'resolve-url';
-
-export default {
-    name: 'ContractEdit',
-    created() {
-        this.uploadUrl = resolveUrl(this.$baseUrl, 'upload/file');
-
-        this.getStoreInfo();
-        this.getCustomerInfo();
-        this.getDepartmentGroup();
-        if (this.$route.query.id) {
-            this.$http
-                .get(`/contract/get/${this.$route.query.id}`)
-                .then(res => {
-                    this.getUser();
-                    if (!res.contactsList) {
-                        res.push({
-                            contactsList: [
-                                {
-                                    name: '',
-                                    mobile: ''
-                                }
-                            ]
-                        });
-                    }
-                    if (!res.contractStoreList) {
-                        res.push({
-                            contractStoreList: [
-                                {
-                                    storeId: '',
-                                    personalFeeTypes: [],
-                                    roomList: [
-                                        {
-                                            price: '',
-                                            beds: '',
-                                            storeInfoId: '',
-                                            roomTypeId: ''
-                                        }
-                                    ]
-                                }
-                            ]
-                        });
-                    } else {
-                        for (var i = res.contractStoreList.length - 1; i >= 0; i--) {
-                            let index = i;
-                            if (!res.contractStoreList[index].storeId) {
-                                continue;
-                            }
-                            let query = {
-                                query: {
-                                    storeId: res.contractStoreList[index].storeId
-                                }
-                            };
-
-                            this.$http
-                                .get(`/roomTypeInfo/all`, query)
-                                .then(room => {
-                                    res.contractStoreList[index].roomTypeInfo = room.content;
-                                })
-                                .catch(e => {
-                                    this.$message.error(e.error);
-                                });
-
-                            //减免项信息
-                            this.$http
-                                .get(`/personalFeeType/all`, query)
-                                .then(per => {
-                                    res.contractStoreList[index].personalFeeTypesData = per.content;
-                                })
-                                .catch(e => {
-                                    this.$message.error(e.error);
-                                });
-                        }
-                    }
-
-                    this.formData = res;
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.$message.error(e.error);
-                });
-        }
-    },
-    data() {
-        return {
-            saving: false,
-            showCycle: false,
-            uploadUrl: '',
-            loading: false,
-            imageUrl: '',
-            text: '',
-            textarea: '',
-            saleEdit: false, //disables 为false
-            formData: {
-                bet: 1,
-                checkInType: 'TEAM',
-                cycles: [],
-                contactsList: [
-                    {
-                        name: '',
-                        mobile: ''
-                    }
-                ],
-                contractStoreList: [
-                    {
-                        storeId: '',
-                        personalFeeTypes: [],
-                        contractRoomInfoList: [],
-                        roomTypeInfo: [],
-                        roomList: []
-                        //     {
-                        //         price: '',
-                        //         beds: '',
-                        //         storeInfoId: '',
-                        //         roomTypeId: ''
-                        //     }
-                        // ]
-                    }
-                ],
-                monthlyRent: 0,
-                deposit: 0,
-                contractMonthly: 0,
-                contractDays: 0
-            },
-            rules: {},
-            CustomerCooperationType: [
-                {
-                    value: 'TEAM',
-                    label: '团队包房'
-                },
-                {
-                    value: 'SCATTERED_BEDS',
-                    label: '团队床位'
-                },
-                {
-                    value: 'TEAM_POST_PAID',
-                    label: '团散'
-                },
-                {
-                    value: 'INDIVIDUAL',
-                    label: '散客'
-                }
-            ],
-            departmentGroup: [],
-            saleUser: [],
-            storeInfo: [],
-            roomTyeInfo: [],
-            customerInfo: [],
-            personalFeeTypes: [],
-            sourceData: [
-                {
-                    value: 'NETWORK',
-                    label: '网络推广(58同城、赶集网、百姓网、贝壳租房、搜房网,其它)'
-                },
-                {
-                    value: 'PLATFORM',
-                    label: '平台推广(嗨住、巴乐兔、平安好房、蘑菇租房、其它)'
-                },
-                { value: 'TELEPHONE', label: '电话陌拜' },
-                { value: 'GROUND_PUSH', label: '地推陌拜' },
-                {
-                    value: 'WORD_MOUTH',
-                    label: '口碑推荐(老客户推荐、朋友推荐)'
-                },
-                { value: 'PEE', label: '中介同行' },
-                { value: 'DOOR', label: '上门咨询' },
-                { value: 'DOWN', label: '公司下发' },
-                { value: 'ADD', label: '新增' },
-                { value: 'RENEWAL', label: '续约' },
-                { value: 'OTHER', label: '其他' }
-            ],
-            statusData: [
-                { value: 'STAY_IN', label: '在住' },
-                { value: 'RETREAT', label: '已退' }
-            ]
-        };
-    },
-    methods: {
-        getUser() {
-            this.$http
-                .get('/user/my')
-                .then(res => {
-                    if (res.position != '销售经理') {
-                        this.saleEdit = true;
-                    }
-                })
-                .catch(e => {
-                    this.$message.error(e.error);
-                });
-        },
-        //
-        cycleGen() {
-            if (this.formData.checkInType == 'TEAM' || this.formData.checkInType == 'SCATTERED_BEDS') {
-                alert(1);
-                this.cycleClick();
-            } else {
-                alert(2);
-                this.cycleClickINDIVIDUAL();
-            }
-        },
-        cycleClickINDIVIDUAL() {
-            this.formData.bet = 0;
-            this.formData.pay = 1;
-            this.formData.monthlyRent = 0;
-            if (!this.formData.contractBeginTime) {
-                this.$message.error('请输入合同开始时间');
-                return;
-            }
-            if (!this.formData.contractEndTime) {
-                this.$message.error('请输入合同结束时间');
-                return;
-            }
-            if (this.formData.contractBeginTime > this.formData.contractEndTime) {
-                this.$message.error('合同结束时间必须大于开始时间');
-                return;
-            }
-
-            //计算周期数 计数30天为准
-            // let cycleAround = Math.round(this.formData.contractDays/30/this.pay);
-            // let moreDay = this.formData.contractDays - (cycleAround * 30);
-            let endTime = new Date(this.formData.contractBeginTime);
-
-            for (let i = 0; i < 36; i++) {
-                let cycleMoney = 0;
-                if (i == 0) {
-                    //交租时间默认为合同开始时间  交付费用 为 押 + 付
-                    cycleMoney = 0;
-                } else {
-                    endTime = new Date(endTime.setMonth(endTime.getMonth() + parseInt(this.formData.pay)));
-                    cycleMoney = 0;
-                }
-                //无限制添加 判断条件是 付款时间大于截止时间 则结束
-                //计算相差时间是否大于一个月
-                var sDate = endTime;
-                var eDate = new Date(this.formData.contractEndTime);
-                var thisMothDays = 1000 * 3600 * 24 * this.getDays();
-                if (eDate - sDate >= thisMothDays) {
-                    if (i == 0) {
-                        continue;
-                        // this.formData.cycles.push({
-                        //     cycle: i + 1,
-                        //     cycleEndTime: this.formData.contractBeginTime,
-                        //     cycleMoney: cycleMoney
-                        // });
-                    } else {
-                        this.formData.cycles.push({
-                            isTeam: false,
-                            cycle: i,
-                            cycleEndTime: this.dateFormat('YYYY-mm-dd HH:MM:SS', endTime),
-                            cycleMoney: cycleMoney
-                        });
-                    }
-                } else {
-                    cycleMoney = Math.round(
-                        ((this.formData.monthlyRent * 12) / 365) *
-                            this.difference(endTime, this.formData.contractEndTime)
-                    );
-                    this.formData.cycles.push({
-                        isTeam: false,
-                        cycle: i + 1,
-                        cycleEndTime: this.formData.contractEndTime,
-                        cycleMoney: cycleMoney
-                    });
-                    break;
-                }
-            }
-            this.showCycle = true;
-        },
-        cycleClick() {
-            if (!this.formData.contractBeginTime) {
-                this.$message.error('请输入合同开始时间');
-                return;
-            }
-            if (!this.formData.contractEndTime) {
-                this.$message.error('请输入合同结束时间');
-                return;
-            }
-            if (this.formData.contractBeginTime > this.formData.contractEndTime) {
-                this.$message.error('合同结束时间必须大于开始时间');
-                return;
-            }
-            if (!this.formData.bet) {
-                this.$message.error('请输入押几');
-                return;
-            }
-            if (!this.formData.pay) {
-                this.$message.error('请输入付几');
-                return;
-            }
-            if (!this.formData.monthlyRent) {
-                this.$message.error('请输入月租金');
-                return;
-            }
-            //计算周期数 计数30天为准
-            // let cycleAround = Math.round(this.formData.contractDays/30/this.pay);
-            // let moreDay = this.formData.contractDays - (cycleAround * 30);
-            let endTime = new Date(this.formData.contractBeginTime);
-
-            for (let i = 0; i < 36; i++) {
-                let cycleMoney = 0;
-                if (i == 0) {
-                    //交租时间默认为合同开始时间  交付费用 为 押 + 付
-                    cycleMoney = Math.round(
-                        this.formData.monthlyRent * parseInt(this.formData.pay) + this.formData.flowBet
-                    );
-                } else {
-                    endTime = new Date(endTime.setMonth(endTime.getMonth() + parseInt(this.formData.pay)));
-                    cycleMoney = Math.round(this.formData.monthlyRent * this.formData.pay);
-                }
-                //无限制添加 判断条件是 付款时间大于截止时间 则结束
-                //计算相差时间是否大于一个月
-                var sDate = endTime;
-                var eDate = new Date(this.formData.contractEndTime);
-                var thisMothDays = 1000 * 3600 * 24 * this.getDays();
-                if (eDate - sDate >= thisMothDays) {
-                    if (i == 0) {
-                        this.formData.cycles.push({
-                            isTeam: true,
-                            cycle: i + 1,
-                            cycleEndTime: this.formData.contractBeginTime,
-                            cycleMoney: cycleMoney
-                        });
-                    } else {
-                        this.formData.cycles.push({
-                            isTeam: true,
-                            cycle: i + 1,
-                            cycleEndTime: this.dateFormat('YYYY-mm-dd HH:MM:SS', endTime),
-                            cycleMoney: cycleMoney
-                        });
-                    }
-                } else {
-                    cycleMoney = Math.round(
-                        ((this.formData.monthlyRent * 12) / 365) *
-                            this.difference(endTime, this.formData.contractEndTime)
-                    );
-                    this.formData.cycles.push({
-                        cycle: i + 1,
-                        cycleEndTime: this.formData.contractEndTime,
-                        cycleMoney: cycleMoney
-                    });
-                    break;
-                }
-            }
-            this.showCycle = true;
-        },
-        dateFormat(fmt, date) {
-            let ret;
-            let opt = {
-                'Y+': date.getFullYear().toString(), // 年
-                'm+': (date.getMonth() + 1).toString(), // 月
-                'd+': date.getDate().toString(), // 日
-                'H+': date.getHours().toString(), // 时
-                'M+': date.getMinutes().toString(), // 分
-                'S+': date.getSeconds().toString() // 秒
-                // 有其他格式化字符需求可以继续添加,必须转化成字符串
-            };
-            for (let k in opt) {
-                ret = new RegExp('(' + k + ')').exec(fmt);
-                if (ret) {
-                    fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0'));
-                }
-            }
-            return fmt;
-        },
-        getDaysOfMonth(year, month) {
-            var date = new Date(year, month, 0);
-            var days = date.getDate();
-            return days;
-        },
-        /**
-         * 获取当前月的总天数
-         */
-        getDays() {
-            var date = new Date();
-            //将当前月份加1,下移到下一个月
-            date.setMonth(date.getMonth() + 1);
-            //将当前的日期置为0,
-            date.setDate(0);
-            //再获取天数即取上个月的最后一天的天数
-            var days = date.getDate();
-            return days;
-        },
-
-        //获取合同时长
-        getContractDays() {
-            if (!this.formData.contractBeginTime) {
-                this.$message.error('请输入合同开始时间');
-                return;
-            }
-            if (!this.formData.contractEndTime) {
-                this.$message.error('请输入合同结束时间');
-                return;
-            }
-            if (this.formData.contractBeginTime > this.formData.contractEndTime) {
-                this.$message.error('合同结束时间必须大于开始时间');
-                return;
-            }
-            this.formData.contractDays = this.difference(
-                this.formData.contractBeginTime,
-                this.formData.contractEndTime
-            );
-        },
-        /**
-         * 获取两个时间相差的天数
-         * */
-        difference(beginTime, endTime) {
-            var dateBegin = new Date(beginTime);
-            var dateEnd = new Date(endTime);
-            var dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数
-            var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
-            return dayDiff;
-            // var leave1 = dateDiff % (24 * 3600 * 1000);    //计算天数后剩余的毫秒数
-            // var hours = Math.floor(leave1 / (3600 * 1000));//计算出小时数
-            // //计算相差分钟数
-            // var leave2 = leave1 % (3600 * 1000);   //计算小时数后剩余的毫秒数
-            // var minutes = Math.floor(leave2 / (60 * 1000)); //计算相差分钟数
-            // //计算相差秒数
-            // var leave3 = leave2 % (60 * 1000);     //计算分钟数后剩余的毫秒数
-            // var seconds = Math.round(leave3 / 1000);
-        },
-        /**
-         * 周期添加
-         */
-        removeCycle(item) {
-            var index = this.formData.cycles.indexOf(item);
-            if (index !== -1) {
-                this.formData.cycles.splice(index, 1);
-            }
-        },
-        addCycle() {
-            this.formData.cycles.push({
-                name: '',
-                mobile: ''
-            });
-        },
-        /**
-         * 联系人添加
-         */
-        removeContacts(item) {
-            var index = this.formData.contactsList.indexOf(item);
-            if (index !== -1) {
-                this.formData.contactsList.splice(index, 1);
-            }
-        },
-        addContacts() {
-            this.formData.contactsList.push({
-                name: '',
-                mobile: ''
-            });
-        },
-        /**
-         * 房型
-         */
-        removeContractFree(item) {
-            var index = this.formData.contractStoreList.indexOf(item);
-            if (index !== -1) {
-                this.formData.contractStoreList.splice(index, 1);
-            }
-        },
-        addContractFree() {
-            this.formData.contractStoreList.push({
-                storeId: '',
-                personalFeeTypes: [],
-                roomTypeInfo: [],
-                contractRoomInfoList: [],
-                roomList: [
-                    {
-                        price: '',
-                        beds: '',
-                        storeInfoId: '',
-                        roomTypeId: ''
-                    }
-                ]
-            });
-        },
-        /**
-         * 房型
-         */
-        removeRoom(contractFree, room) {
-            var index = this.formData.contractStoreList.indexOf(contractFree);
-            var roomIndex = this.formData.contractStoreList[index].roomList.indexOf(room);
-            if (roomIndex !== -1) {
-                this.formData.contractStoreList[index].roomList.splice(roomIndex, 1);
-            }
-        },
-        addRoom(contractFree) {
-            var index = this.formData.contractStoreList.indexOf(contractFree);
-            this.formData.contractStoreList[index].roomList.push({
-                roomTypeId: '',
-                price: '',
-                beds: ''
-            });
-        },
-        getRoomTyeInfo(room, index) {
-            //房型信息
-            let query = {
-                query: { storeId: room.storeId }
-            };
-            this.$http
-                .get(`/roomTypeInfo/all`, query)
-                .then(res => {
-                    var index = this.formData.contractStoreList.indexOf(room);
-                    this.formData.contractStoreList[index].roomTypeInfo = res.content;
-                })
-                .catch(e => {
-                    this.$message.error(e.error);
-                });
-            this.formData.contractStoreList[index].personalFeeTypes = [];
-            this.formData.contractStoreList[index].contractRoomInfoList = [];
-            //减免项信息
-            // this.$http
-            //     .get(`/personalFeeType/all`, query)
-            //     .then(res => {
-            //         var index = this.formData.contractStoreList.indexOf(room);
-            //         this.formData.contractStoreList[
-            //             index
-            //         ].personalFeeTypesData = res.content;
-            //     })
-            //     .catch(e => {
-            //         this.$message.error(e.error);
-            //     });
-        },
-        changeSaleInfo(dId) {
-            let lable = this.departmentGroup.filter(i => {
-                return i.id === dId;
-            })[0].name;
-            this.formData.departmentName = lable;
-
-            let data = {
-                id: dId
-            };
-            this.$http
-                .get(`/department/treeWithUsers`, data)
-                .then(res => {
-                    this.saleUser = res.users;
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.$message.error(e.error);
-                });
-        },
-        getCustomerInfo() {
-            this.$http
-                .get(`/customer/all`, { size: 1000 })
-                .then(res => {
-                    this.customerInfo = res.content;
-                })
-                .catch(e => {
-                    this.$message.error(e.error);
-                });
-        },
-        getStoreInfo() {
-            this.$http
-                .get(`/storeInfo/getChooseAll`, { size: 1000 })
-                .then(res => {
-                    this.storeInfo = res.content;
-                })
-                .catch(e => {
-                    this.$message.error(e.error);
-                });
-        },
-        //获取销售员信息
-        getDepartmentGroup() {
-            this.$http
-                .get(`/user/allSales`)
-                .then(res => {
-                    this.saleUser = res;
-                })
-                .catch(e => {
-                    this.$message.error(e.error);
-                });
-        },
-        changeSaleName(saleId) {
-            let saleInfo = this.saleNameLabel(saleId);
-            this.formData.saleName = saleInfo.nickname;
-            this.formData.departmentId = saleInfo.departments[0].id;
-            this.formData.departmentName = saleInfo.departments[0].name;
-        },
-        saleNameLabel(saleId) {
-            let label = this.saleUser.filter(i => {
-                return i.id === saleId;
-            })[0];
-            return label;
-        },
-
-        getSaleUser() {
-            this.$http
-                .get(`/contract/get/${this.$route.query.id}`)
-                .then(res => {
-                    this.formData = res;
-                })
-                .catch(e => {
-                    console.log(e);
-                    this.$message.error(e.error);
-                });
-        },
-        onSave() {
-            this.$refs.form.validate(valid => {
-                if (valid) {
-                    this.submit();
-                } else {
-                    return false;
-                }
-            });
-        },
-        submit() {
-            this.$store.commit('updateFetchingData', true);
-            let data = { ...this.formData };
-
-            this.$http
-                .post('/contract/save', data, { body: 'json' })
-                .then(res => {
-                    this.$store.commit('updateFetchingData', false);
-                    this.$message.success('成功');
-                    this.$router.go(-1);
-                })
-                .catch(e => {
-                    this.$store.commit('updateFetchingData', false);
-                    console.log(e);
-                    this.$message.error(e.error);
-                });
-        },
-        onDelete() {
-            this.$alert('删除将无法恢复,确认要删除么?', '警告', {
-                type: 'error'
-            })
-                .then(() => {
-                    return this.$http.post('/contract/del', {
-                        id: this.formData.id
-                    });
-                })
-                .then(() => {
-                    this.$message.success('删除成功');
-                    this.$router.go(-1);
-                })
-                .catch(e => {
-                    if (e !== 'cancel') {
-                        console.log(e);
-                        this.$message.error(e.error);
-                    }
-                });
-        },
-        getPersonalFeeTypes(id) {
-            var list = [];
-            if (id) {
-                var storeList = [...this.storeInfo];
-                storeList.forEach(item => {
-                    if (item.id == id) {
-                        list = item.personalFeeTypes;
-                    }
-                });
-            }
-
-            return list;
-        },
-        getContractRoomInfoList(id) {
-            var list = [];
-            if (id) {
-                var storeList = [...this.storeInfo];
-                storeList.forEach(item => {
-                    if (item.id == id) {
-                        list = item.roomInfos;
-                    }
-                });
-            }
-
-            return list;
-        },
-        onSuccess(res, file) {
-            this.formData.enclosure = res;
-            this.loading = false;
-            this.imageUrl = URL.createObjectURL(file.raw);
-            var newVal = '';
-            if (res instanceof Array) {
-                newVal = res[0];
-            } else {
-                newVal = res;
-            }
-            this.$emit('input', newVal);
-        },
-        onError(err, file, fileList) {
-            this.loading = false;
-        },
-        beforeUpload(file) {
-            this.loading = true;
-            return true;
-        },
-        updateImageUrl(url) {
-            this.imageUrl = url;
-        }
-    }
-};
-</script>
-<style lang="less" scoped>
-.stepInfo {
-    background: rgba(242, 244, 245, 1);
-    border-radius: 4px;
-    padding: 20px;
-    margin-bottom: 15px;
-
-    .step-title {
-        font-size: 14px;
-        font-weight: bold;
-        color: rgba(72, 87, 106, 1);
-        line-height: 16px;
-        margin-bottom: 15px;
-    }
-
-    .btnList {
-        display: flex;
-        margin-bottom: 15px;
-    }
-
-    .houseInfo {
-        padding: 15px;
-        border: 1px solid #ccc;
-        border-radius: 3px;
-        margin-bottom: 15px;
-    }
-
-    .loading {
-        position: absolute;
-        top: 0;
-        bottom: 0;
-        left: 0;
-        right: 0;
-        margin: auto;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        background: rgba(255, 255, 255, 0.6);
-        color: @text1;
-        font-size: 24px;
-    }
-
-    .avatar-uploader-icon {
-        font-size: 28px;
-        color: #8c939d;
-        width: 178px;
-        height: 178px;
-        line-height: 178px;
-        text-align: center;
-        border: 1px dashed #d9d9d9;
-        border-radius: 6px;
-        cursor: pointer;
-        position: relative;
-        overflow: hidden;
-        background-color: #fbfdff;
-
-        &:hover {
-            border-color: #409eff;
-        }
-    }
-
-    .avatar {
-        width: 178px;
-        height: 178px;
-        display: block;
-        border: 1px dashed #d9d9d9;
-        border-radius: 6px;
-        cursor: pointer;
-        position: relative;
-        overflow: hidden;
-
-        &:hover {
-            border-color: #409eff;
-        }
-    }
-
-    .wrapper {
-        position: relative;
-    }
-
-    .single-upload .el-upload {
-        position: relative;
-    }
-}
-</style>

+ 5 - 17
src/main/vue/src/views/sale/ContractList.vue

@@ -155,7 +155,7 @@
             <el-table-column prop="customerIndustry" label="客户行业" width="150"></el-table-column>
             <el-table-column label="联系人" width="80">
                 <template slot-scope="{ row }">
-                    <el-button @click="openContactsDataDialog(row.contactsList)" size="mini" plain>查看</el-button>
+                    <el-button @click="openContactsDataDialog(row.contactList)" size="mini" plain>查看</el-button>
                 </template>
             </el-table-column>
             <el-table-column prop="saleName" label="销售员" width="80"> </el-table-column>
@@ -343,26 +343,14 @@
                     ></residenceData>
                 </el-dialog>
 
-                <el-dialog
-                    class="contactsData"
-                    title="联系人"
-                    :visible.sync="contactsDataDialog"
-                    width="60%"
-                    :modal-append-to-body="false"
-                >
+                <el-dialog title="联系人" :visible.sync="showContractsDialog" width="60%" :modal-append-to-body="false">
                     <el-table :data="contactsData" stripe style="width: 100%">
                         <el-table-column prop="name" label="姓名"></el-table-column>
                         <el-table-column prop="mobile" label="地址"></el-table-column>
                     </el-table>
                 </el-dialog>
 
-                <el-dialog
-                    class="contactsData"
-                    title="收款周期"
-                    :visible.sync="cycleDataDialog"
-                    width="60%"
-                    :modal-append-to-body="false"
-                >
+                <el-dialog title="收款周期" :visible.sync="cycleDataDialog" width="60%" :modal-append-to-body="false">
                     <el-table :data="cycleData" stripe style="width: 100%">
                         <el-table-column prop="cycle" label="期数"></el-table-column>
                         <el-table-column prop="cycleStart" label="周期开始时间"></el-table-column>
@@ -431,7 +419,7 @@ export default {
             renewalDataDialog: false,
             residenceDataDialogurl: false,
             residenceDataDialog: false,
-            contactsDataDialog: false,
+            showContractsDialog: false,
             contactsData: [],
             cycleDataDialog: false,
             cycleData: [],
@@ -817,7 +805,7 @@ export default {
         //联系人弹出框
         openContactsDataDialog(data) {
             this.contactsData = data;
-            this.contactsDataDialog = true;
+            this.showContractsDialog = true;
         },
         //收款周期弹出框
         openCycleDataDialog(data) {

+ 1 - 1
src/main/vue/src/views/sale/RecoveryContractList.vue

@@ -126,7 +126,7 @@
                     <el-button @click="renewalList(row.contractNumber)" type="success" size="mini" plain
                         >续约订单
                     </el-button>
-                    <el-button @click="openContactsDataDialog(row.contactsList)" type="success" size="mini" plain
+                    <el-button @click="openContactsDataDialog(row.contactList)" type="success" size="mini" plain
                         >联系人
                     </el-button>
                     <el-button @click="openRoomDataDialog(row.roomList)" type="success" size="mini" plain

+ 5 - 5
src/test/java/com/izouma/zhumj/repo/sale/ContractRepoTest.java

@@ -158,7 +158,7 @@ public class ContractRepoTest extends ZhumjApplicationTests {
             if (!c[6].trim().equals("QWER")) {
                 contract.setContactAddress(c[6].trim());
             }
-            List<ContractContacts> contacts = new ArrayList<>();
+            List<ContractContact> contacts = new ArrayList<>();
             if (!c[7].trim().equals("QWER")) {
                 String con = c[7].trim();
                 String[] conrs = r.split("@");
@@ -166,10 +166,10 @@ public class ContractRepoTest extends ZhumjApplicationTests {
                     ry = ry.replace("[", "");
                     ry = ry.replace("]", "");
                     String[] ryp = ry.split(",");
-                    ContractContacts contractContacts = new ContractContacts();
-                    contractContacts.setName(ryp[0].trim());
-                    contractContacts.setMobile(ryp[1].trim());
-                    contacts.add(contractContacts);
+                    ContractContact contractContact = new ContractContact();
+                    contractContact.setName(ryp[0].trim());
+                    contractContact.setMobile(ryp[1].trim());
+                    contacts.add(contractContact);
                 }
 
             }

+ 0 - 7
src/test/java/com/izouma/zhumj/service/sale/CustomerServiceTest.java

@@ -22,11 +22,4 @@ public class CustomerServiceTest extends ZhumjApplicationTests {
     private CustomerService customerService;
     @Autowired
     private ContractRepo contractRepo;
-    @Test
-    public void synchronizeContract() {
-        List<Contract> all = contractRepo.findAll();
-        all.stream().forEach(contract -> {
-            customerService.SynchronizeContract(contract.getContractNumber());
-        });
-    }
 }

+ 0 - 6
src/test/java/com/izouma/zhumj/service/sale/SaleAchievementServiceTest.java

@@ -21,10 +21,4 @@ public class SaleAchievementServiceTest extends ZhumjApplicationTests {
     private SaleAchievementService achievementService;
     @Autowired
     private CustomerService customerService;
-    @Test
-    public void sy(){
-        customerService.SynchronizeContract("201911200001");
-//        achievementService.SynchronizeContract("201911200001");
-    }
-
 }