Prechádzať zdrojové kódy

feat:客户/供应商相关接口

zhangwei 3 rokov pred
rodič
commit
1c3c0fd2ce
26 zmenil súbory, kde vykonal 1131 pridanie a 327 odobranie
  1. 107 107
      src/main/java/com/winhc/repal/common/BaseController.java
  2. 84 0
      src/main/java/com/winhc/repal/controller/RepalCustomerController.java
  3. 85 0
      src/main/java/com/winhc/repal/enums/Dict.java
  4. 35 0
      src/main/java/com/winhc/repal/model/bo/RepalCustomerInfoBO.java
  5. 5 5
      src/main/java/com/winhc/repal/model/cvt/RepalCustomerConvert.java
  6. 2 0
      src/main/java/com/winhc/repal/model/dto/DeleteRepalBillDTO.java
  7. 21 0
      src/main/java/com/winhc/repal/model/dto/PageDTO.java
  8. 14 24
      src/main/java/com/winhc/repal/model/dto/RepalCustomerDTO.java
  9. 31 0
      src/main/java/com/winhc/repal/model/dto/RepalCustomerQueryDTO.java
  10. 17 25
      src/main/java/com/winhc/repal/model/vo/RepalCustomerVO.java
  11. 2 14
      src/main/java/com/winhc/repal/model/dto/RepalLinkDTO.java
  12. 21 0
      src/main/java/com/winhc/repal/model/vo/RemindTypeUnReadCountVO.java
  13. 36 0
      src/main/java/com/winhc/repal/model/vo/RepalBillRemindUnReadVO.java
  14. 20 13
      src/main/java/com/winhc/repal/model/vo/RepalCustomerVO.java
  15. 46 0
      src/main/java/com/winhc/repal/model/vo/RepalCustomerInfoVO.java
  16. 30 0
      src/main/java/com/winhc/repal/model/vo/RepalGroupMemberVO.java
  17. 26 0
      src/main/java/com/winhc/repal/model/vo/RepalOperLogContentVO.java
  18. 46 0
      src/main/java/com/winhc/repal/model/vo/RepalSupplyInfoVO.java
  19. 18 1
      src/main/java/com/winhc/repal/repository/RepalCustomerMapper.java
  20. 7 1
      src/main/java/com/winhc/repal/repository/RepalRemindHistoryMapper.java
  21. 38 41
      src/main/java/com/winhc/repal/service/RepalCustomerService.java
  22. 6 43
      src/main/java/com/winhc/repal/service/RepalRemindHistoryService.java
  23. 354 23
      src/main/java/com/winhc/repal/service/impl/RepalCustomerServiceImpl.java
  24. 31 30
      src/main/java/com/winhc/repal/service/impl/RepalRemindHistoryServiceImpl.java
  25. 34 0
      src/main/resources/mapper/RepalCustomerMapper.xml
  26. 15 0
      src/main/resources/mapper/RepalRemindHistoryMapper.xml

+ 107 - 107
src/main/java/com/winhc/repal/common/BaseController.java

@@ -1,107 +1,107 @@
-//package com.winhc.returnmoney.common;
-//
-//import com.module.login.usersession.UserBean;
-//import com.winhc.common.enums.CodeMsg;
-//import com.winhc.common.exception.CommonException;
-//import com.winhc.common.util.GSON;
-//import com.winhc.returnmoney.enums.AppPackageEnum;
-//import org.apache.commons.lang.StringUtils;
-//import org.apache.commons.logging.Log;
-//import org.apache.commons.logging.LogFactory;
-//import org.springframework.web.context.request.RequestContextHolder;
-//import org.springframework.web.context.request.ServletRequestAttributes;
-//
-//import javax.servlet.http.HttpServletRequest;
-//import javax.servlet.http.HttpServletResponse;
-//import javax.servlet.http.HttpSession;
-//import java.util.Objects;
-//
-///**
-// * 所有Action的基础类.
-// *
-// * @author
-// */
-//public abstract class BaseController {
-//
-//    private static final Log log = LogFactory.getLog(BaseController.class);
-//
-//
-//    protected HttpServletResponse response;
-//
-//    public HttpSession getSession() {
-//        return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes()))
-//                .getRequest().getSession();
-//    }
-//
-//    public HttpServletRequest getRequest() {
-//        return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
-//    }
-//
-//    public String getAppid() {
-//        HttpServletRequest request = getRequest();
-//        String appId = request.getHeader("appid");
-//        return appId;
-//    }
-//
-//    public String getSessionId() {
-//        HttpServletRequest request = getRequest();
-//        String sessionId = request.getHeader("sessionId");
-//        return sessionId;
-//    }
-//
-//    public void getApiInfo() {
-//        HttpServletRequest request = getRequest();
-//        String apiVersion = request.getHeader("apiVersion");
-//        String sessionId = request.getHeader("sessionId");
-//        String appId = request.getHeader("appid");
-//        String osType = request.getHeader("osType");
-//        String deviceId = request.getHeader("deviceId");
-//        String brand = request.getHeader("brand");
-//        String osVersion = request.getHeader("osVersion");
-//        String appVersion = request.getHeader("appVersion");
-//        String userInfo = request.getHeader("userInfo");
-//        log.info(" *****************************************************************************************************"
-//                + "*******************************************************************************************************************");
-//        log.info(" userInfo :" + userInfo +",apiVersion :" + apiVersion + " ,sessionId: " + sessionId + " , appId: " + appId
-//                + " ,osType: " + osType + " ,deviceId : " + deviceId + " , brand : " + brand
-//                + " ,osVersion : " + osVersion + " , appVersion :" + appVersion);
-//        log.info(" *****************************************************************************************************"
-//                + "*******************************************************************************************************************");
-//    }
-//
-//    /**
-//     * 获取app版本
-//     * @return java.lang.String
-//     * @author xda
-//     * @date 2021/5/6 14:20
-//     */
-//    public String getAppVersion() {
-//        HttpServletRequest request = getRequest();
-//        return request.getHeader("appVersion");
-//    }
-//
-//    public UserBean getUser() {
-//        HttpServletRequest request = getRequest();
-//        String userInfo = request.getHeader("userInfo");
-//        if (StringUtils.isEmpty(userInfo)) {
-//            throw new CommonException(CodeMsg.UNAUTHORIZED);
-//        }
-//        UserBean user = GSON.fromJson(userInfo, UserBean.class);
-//        if (Objects.isNull(user)) {
-//            throw new CommonException(CodeMsg.UNAUTHORIZED);
-//        }
-//        log.info(String.format("userInfo:[%s]", GSON.toJSON(user)));
-//        return user;
-//    }
-//
-//    /**
-//     * 获取包名
-//     * @return java.lang.String
-//     * @author xda
-//     * @date 2021/10/21 09:26
-//     */
-//    public String getAppPackageName() {
-//        return AppPackageEnum.getAppPackageEnum(getRequest().getHeader("appPackage")).getPackageName();
-//    }
-//
-//}
+package com.winhc.repal.common;
+
+import com.module.login.usersession.UserBean;
+import com.winhc.common.enums.CodeMsg;
+import com.winhc.common.exception.CommonException;
+import com.winhc.common.util.GSON;
+import com.winhc.repal.enums.AppPackageEnum;
+import org.apache.commons.lang.StringUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.util.Objects;
+
+/**
+ * 所有Action的基础类.
+ *
+ * @author
+ */
+public abstract class BaseController {
+
+    private static final Log log = LogFactory.getLog(BaseController.class);
+
+
+    protected HttpServletResponse response;
+
+    public HttpSession getSession() {
+        return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes()))
+                .getRequest().getSession();
+    }
+
+    public HttpServletRequest getRequest() {
+        return ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
+    }
+
+    public String getAppid() {
+        HttpServletRequest request = getRequest();
+        String appId = request.getHeader("appid");
+        return appId;
+    }
+
+    public String getSessionId() {
+        HttpServletRequest request = getRequest();
+        String sessionId = request.getHeader("sessionId");
+        return sessionId;
+    }
+
+    public void getApiInfo() {
+        HttpServletRequest request = getRequest();
+        String apiVersion = request.getHeader("apiVersion");
+        String sessionId = request.getHeader("sessionId");
+        String appId = request.getHeader("appid");
+        String osType = request.getHeader("osType");
+        String deviceId = request.getHeader("deviceId");
+        String brand = request.getHeader("brand");
+        String osVersion = request.getHeader("osVersion");
+        String appVersion = request.getHeader("appVersion");
+        String userInfo = request.getHeader("userInfo");
+        log.info(" *****************************************************************************************************"
+                + "*******************************************************************************************************************");
+        log.info(" userInfo :" + userInfo +",apiVersion :" + apiVersion + " ,sessionId: " + sessionId + " , appId: " + appId
+                + " ,osType: " + osType + " ,deviceId : " + deviceId + " , brand : " + brand
+                + " ,osVersion : " + osVersion + " , appVersion :" + appVersion);
+        log.info(" *****************************************************************************************************"
+                + "*******************************************************************************************************************");
+    }
+
+    /**
+     * 获取app版本
+     * @return java.lang.String
+     * @author xda
+     * @date 2021/5/6 14:20
+     */
+    public String getAppVersion() {
+        HttpServletRequest request = getRequest();
+        return request.getHeader("appVersion");
+    }
+
+    public UserBean getUser() {
+        HttpServletRequest request = getRequest();
+        String userInfo = request.getHeader("userInfo");
+        if (StringUtils.isEmpty(userInfo)) {
+            throw new CommonException(CodeMsg.UNAUTHORIZED);
+        }
+        UserBean user = GSON.fromJson(userInfo, UserBean.class);
+        if (Objects.isNull(user)) {
+            throw new CommonException(CodeMsg.UNAUTHORIZED);
+        }
+        log.info(String.format("userInfo:[%s]", GSON.toJSON(user)));
+        return user;
+    }
+
+    /**
+     * 获取包名
+     * @return java.lang.String
+     * @author xda
+     * @date 2021/10/21 09:26
+     */
+    public String getAppPackageName() {
+        return AppPackageEnum.getAppPackageEnum(getRequest().getHeader("appPackage")).getPackageName();
+    }
+
+}

+ 84 - 0
src/main/java/com/winhc/repal/controller/RepalCustomerController.java

@@ -0,0 +1,84 @@
+package com.winhc.repal.controller;
+
+import com.winhc.common.base.BeanResponse;
+import com.winhc.common.enums.CodeMsg;
+import com.winhc.common.model.base.VOPage;
+import com.winhc.repal.common.BaseController;
+import com.winhc.repal.enums.Dict;
+import com.winhc.repal.model.dto.RepalCustomerDTO;
+import com.winhc.repal.model.dto.RepalCustomerQueryDTO;
+import com.winhc.repal.model.dto.RepalCustomerUpdateDTO;
+import com.winhc.repal.model.vo.RepalCustomerDetailVO;
+import com.winhc.repal.model.vo.RepalCustomerInfoVO;
+import com.winhc.repal.service.RepalCustomerService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * @author Aaron
+ * @date 2022/4/19 13:08
+ * @description
+ */
+@Api(tags = "回款宝 客户/供应 商管理")
+@RestController
+@RequestMapping(value = "/repalCustomer")
+public class RepalCustomerController extends BaseController {
+    @Autowired
+    private RepalCustomerService repalCustomerService;
+
+    @ApiOperation("分页查询客户")
+    @GetMapping(value = "/cust/page")
+    public BeanResponse<VOPage<RepalCustomerInfoVO>> getRepalCustPage(RepalCustomerQueryDTO dto){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalCustomerService.find(dto.setCustType(Dict.custTypeEnum.客户.getCode())));
+    }
+
+    @ApiOperation("添加客户")
+    @PostMapping("/cust")
+    public BeanResponse<RepalCustomerDetailVO> addCustomer(@RequestBody RepalCustomerDTO dto){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalCustomerService.addCustomer(dto.setCustType(Dict.custTypeEnum.客户.getCode()),getUser()));
+    }
+
+    @ApiOperation("修改客户")
+    @PostMapping("/cust/modify")
+    public BeanResponse<RepalCustomerDetailVO> modifyCustomer(@RequestBody RepalCustomerUpdateDTO dto){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalCustomerService.updateCustomer(dto.setCustType(Dict.custTypeEnum.客户.getCode()),getUser()));
+    }
+
+    @ApiOperation("客户详情")
+    @GetMapping(value = "/cust/{custId}")
+    public BeanResponse<RepalCustomerDetailVO> getRepalCustomerDetail(@PathVariable("custId")Long custId){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalCustomerService.getDetailById(custId));
+    }
+
+    @ApiOperation("分页查询供应商")
+    @GetMapping(value = "/supply/page")
+    public BeanResponse<VOPage<RepalCustomerInfoVO>> getRepalSupplyPage(RepalCustomerQueryDTO dto){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalCustomerService.find(dto.setCustType(Dict.custTypeEnum.供应商.getCode())));
+    }
+
+    @ApiOperation("添加供应商")
+    @PostMapping("/supply")
+    public BeanResponse<RepalCustomerDetailVO> addSupply(@RequestBody RepalCustomerDTO dto){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalCustomerService.addCustomer(dto.setCustType(Dict.custTypeEnum.客户.getCode()),getUser()));
+    }
+
+    @ApiOperation("修改供应商")
+    @PostMapping("/supply/modify")
+    public BeanResponse<RepalCustomerDetailVO> modifySupply(@RequestBody RepalCustomerUpdateDTO dto){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalCustomerService.updateCustomer(dto.setCustType(Dict.custTypeEnum.供应商.getCode()),getUser()));
+    }
+
+    @ApiOperation("供应商详情")
+    @GetMapping(value = "/supply/{custId}")
+    public BeanResponse<RepalCustomerDetailVO> getRepalSupplyDetail(@PathVariable("custId")Long custId){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalCustomerService.getDetailById(custId));
+    }
+
+    @ApiOperation("删除客户/供应商")
+    @DeleteMapping("/{custId}")
+    public BeanResponse<Boolean> deleteCustomer(@PathVariable("custId")Long custId){
+        return BeanResponse.success(CodeMsg.SUCCESS,repalCustomerService.deleteCustomer(custId,getUser()));
+    }
+}

+ 85 - 0
src/main/java/com/winhc/repal/enums/Dict.java

@@ -0,0 +1,85 @@
+package com.winhc.repal.enums;
+
+import cn.hutool.core.util.ObjectUtil;
+
+/**
+ * @description: 字典数据
+ *
+ */
+public class Dict {
+
+    public enum DeletedStatusEnunm {
+        /**
+         *  是否删除
+         */
+        否(0),
+        是(1);
+
+        public Integer code;
+
+        DeletedStatusEnunm(Integer code) {
+            this.code = code;
+        }
+
+        public Integer getCode() {
+            return code;
+        }
+    }
+
+    /**
+     * 日志动作枚举
+     */
+    public enum ActionCodeEnum {
+        新增客户("CUST_ADD","add"),修改客户("CUST_UPDATE","update"),删除客户("CUST_DEL","delete"),
+        新增供应商("SUPPLY_ADD","add"),修改供应商("SUPPLY_UPDATE","update"),删除供应商("SUPPLY_DEL","delete");
+        public String code;
+
+        public String bizType;
+
+        ActionCodeEnum(String code, String bizType) {
+            this.code = code;
+            this.bizType = bizType;
+        }
+
+        public String getCode() {
+            return code;
+        }
+
+        public String getBizType() {
+            return bizType;
+        }
+    }
+
+    public enum RemindEnum {
+        /**
+         * 智能提醒类型
+         */
+        逾期提醒,账款评级,财产线索,风险预警;
+    }
+
+    public enum custTypeEnum {
+        客户(1),供应商(2);
+        public Integer code;
+
+        custTypeEnum(Integer code) {
+            this.code = code;
+        }
+
+        public Integer getCode() {
+            return code;
+        }
+    }
+
+    public enum custPropertyEnum{
+        企业(1),个人(2),政府事业单位(3);
+        public Integer code;
+
+        custPropertyEnum(Integer code) {
+            this.code = code;
+        }
+
+        public Integer getCode() {
+            return code;
+        }
+    }
+}

+ 35 - 0
src/main/java/com/winhc/repal/model/bo/RepalCustomerInfoBO.java

@@ -0,0 +1,35 @@
+package com.winhc.repal.model.bo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * @author Aaron
+ * @date 2022/4/24 10:57
+ * @description
+ */
+@Data
+public class RepalCustomerInfoBO {
+    @ApiModelProperty(value = "客户id")
+    private Long custId;
+
+    @ApiModelProperty(value = "客户名称")
+    private String custName;
+
+    @ApiModelProperty(value = "客户性质 1企业 2个人 3政府事业单位")
+    private Integer custProperty;
+
+    @ApiModelProperty(value = "1客户  2供应商")
+    private Integer custType;
+
+    @ApiModelProperty("关联账款数量")
+    private Integer repalBillCount;
+
+    @ApiModelProperty(value = "账款总金额")
+    private BigDecimal totalMoney;
+
+    @ApiModelProperty(value = "待收金额")
+    private BigDecimal receivable;
+}

+ 5 - 5
src/main/java/com/winhc/repal/model/cvt/RepalCustomerConvert.java

@@ -1,8 +1,8 @@
 package com.winhc.repal.model.cvt;
 
 import com.winhc.repal.entity.RepalCustomer;
-import com.winhc.repal.model.dto.RepalCustomerDTO;
-import com.winhc.repal.model.vo.RepalCustomerVO;
+import com.winhc.repal.model.dto.RepalCustomerQueryDTO;
+import com.winhc.repal.model.vo.RepalCustomerInfoVO;
 import org.springframework.beans.BeanUtils;
 /**
  * @description RepalCustomer 对象转换类
@@ -11,14 +11,14 @@ import org.springframework.beans.BeanUtils;
  */
 public class RepalCustomerConvert {
 
-    public static RepalCustomer DTOToEntity(RepalCustomerDTO dto) {
+    public static RepalCustomer DTOToEntity(RepalCustomerQueryDTO dto) {
         RepalCustomer entity = new RepalCustomer();
         BeanUtils.copyProperties(dto, entity);
         return entity;
     }
 
-    public static RepalCustomerVO EntityToVO(RepalCustomer entity) {
-        RepalCustomerVO vo = new RepalCustomerVO ();
+    public static RepalCustomerInfoVO EntityToVO(RepalCustomer entity) {
+        RepalCustomerInfoVO vo = new RepalCustomerInfoVO();
         BeanUtils.copyProperties(entity, vo);
         return vo;
     }

+ 2 - 0
src/main/java/com/winhc/repal/model/dto/DeleteRepalBillDTO.java

@@ -3,6 +3,7 @@ package com.winhc.repal.model.dto;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.experimental.Accessors;
 
 /**
  * @Description: DeleteRepalBillDTO
@@ -11,6 +12,7 @@ import lombok.Data;
  */
 @Data
 @ApiModel("删除账款")
+@Accessors(chain = true)
 public class DeleteRepalBillDTO {
 
     @ApiModelProperty("账款id")

+ 21 - 0
src/main/java/com/winhc/repal/model/dto/PageDTO.java

@@ -0,0 +1,21 @@
+package com.winhc.repal.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Description: PageDTO
+ * @Author: xda
+ * @Date: 2020/12/16  11:46
+ */
+@Data
+@ApiModel("分页dto")
+public class PageDTO {
+
+    @ApiModelProperty("页长")
+    private Integer pageSize = 20;
+
+    @ApiModelProperty("页码")
+    private Integer pageNum = 1;
+}

+ 14 - 24
src/main/java/com/winhc/repal/model/dto/RepalCustomerDTO.java

@@ -1,26 +1,22 @@
 package com.winhc.repal.model.dto;
 
-import java.time.LocalDateTime;
-
+import com.winhc.repal.model.vo.RepalGroupMemberVO;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
+import java.util.List;
+
 /**
- * @description RepalCustomer DTO对象
+ * @description RepalCustomer实体对象
  * @author Generator
  * @date 2022-04-08
  */
 @Data
 @Accessors(chain = true)
-@ApiModel(value="RepalCustomer DTO对象", description="回款宝客户表")
+@ApiModel(value="查询客户或供应商")
 public class RepalCustomerDTO {
-
-
-    @ApiModelProperty(value = "客户id")
-    private Long custId;
-
     @ApiModelProperty(value = "客户名称")
     private String custName;
 
@@ -33,29 +29,23 @@ public class RepalCustomerDTO {
     @ApiModelProperty(value = "所属行业JSON")
     private String industry;
 
-    @ApiModelProperty(value = "办公地址")
+    @ApiModelProperty(value = "办公地址,前面拼一下省市区")
     private String address;
 
+    @ApiModelProperty(value = "负责人userId")
+    private List<Long> charges;
+
+    @ApiModelProperty(value = "联系人")
+    private List<RepalLinkDTO> links;
+
     @ApiModelProperty(value = "附件JSON")
     private String attachment;
 
     @ApiModelProperty(value = "备注信息")
     private String remark;
 
-    @ApiModelProperty(value = "所属用户")
-    private Long belongUserId;
-
-    @ApiModelProperty(value = "是否删除 0否 1是")
-    private Integer deleted;
-
-    @ApiModelProperty(value = "创建时间")
-    private LocalDateTime timeCreated;
-
-    @ApiModelProperty(value = "修改时间")
-    private LocalDateTime timeModified;
-
-    @ApiModelProperty(value = "1客户  2供应商")
+    //不开放
+    @ApiModelProperty("不需要传")
     private Integer custType;
 
-
 }

+ 31 - 0
src/main/java/com/winhc/repal/model/dto/RepalCustomerQueryDTO.java

@@ -0,0 +1,31 @@
+package com.winhc.repal.model.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @description RepalCustomer DTO对象
+ * @author Generator
+ * @date 2022-04-08
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Accessors(chain = true)
+@ApiModel("客户/供应商查询")
+public class RepalCustomerQueryDTO extends PageDTO {
+
+    @ApiModelProperty(value = "所属组织id")
+    private Long repalGroupId;
+
+    @ApiModelProperty(value = "客户性质 1企业 2个人 3政府事业单位")
+    private Integer custProperty;
+
+    @ApiModelProperty(value = "排序类型 1(默认)创建时间升序 2账款数量升序 3账款数量降序 4账款总金额升序 5账款总金额降序 ")
+    private Integer sortType;
+
+    //不开放
+    private Integer custType;
+}

+ 17 - 25
src/main/java/com/winhc/repal/model/vo/RepalCustomerVO.java

@@ -1,22 +1,21 @@
-package com.winhc.repal.model.vo;
-
-import java.time.LocalDateTime;
+package com.winhc.repal.model.dto;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
+import java.util.List;
+
 /**
- * @description RepalCustomer VO对象
- * @author Generator
- * @date 2022-04-08
+ * @author Aaron
+ * @date 2022/4/24 17:54
+ * @description
  */
 @Data
 @Accessors(chain = true)
-@ApiModel(value="RepalCustomer VO对象", description="回款宝客户表")
-public class RepalCustomerVO {
-
+@ApiModel(value="修改客户或供应商")
+public class RepalCustomerUpdateDTO {
     @ApiModelProperty(value = "客户id")
     private Long custId;
 
@@ -32,29 +31,22 @@ public class RepalCustomerVO {
     @ApiModelProperty(value = "所属行业JSON")
     private String industry;
 
-    @ApiModelProperty(value = "办公地址")
+    @ApiModelProperty(value = "办公地址,前面拼一下省市区")
     private String address;
 
+    @ApiModelProperty(value = "负责人userId,不修改不要传!!")
+    private List<Long> charges;
+
+    @ApiModelProperty(value = "联系人,不修改不要传!!")
+    private List<RepalLinkDTO> links;
+
     @ApiModelProperty(value = "附件JSON")
     private String attachment;
 
     @ApiModelProperty(value = "备注信息")
     private String remark;
 
-    @ApiModelProperty(value = "所属用户")
-    private Long belongUserId;
-
-    @ApiModelProperty(value = "是否删除 0否 1是")
-    private Integer deleted;
-
-    @ApiModelProperty(value = "创建时间")
-    private LocalDateTime timeCreated;
-
-    @ApiModelProperty(value = "修改时间")
-    private LocalDateTime timeModified;
-
-    @ApiModelProperty(value = "1客户  2供应商")
+    //不开放
+    @ApiModelProperty("不需要传")
     private Integer custType;
-
-
 }

+ 2 - 14
src/main/java/com/winhc/repal/model/dto/RepalLinkDTO.java

@@ -1,7 +1,5 @@
 package com.winhc.repal.model.dto;
 
-import java.time.LocalDateTime;
-
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -14,11 +12,9 @@ import lombok.experimental.Accessors;
  */
 @Data
 @Accessors(chain = true)
-@ApiModel(value="RepalLink DTO对象", description="回款宝客户联系人")
+@ApiModel("回款宝客户联系人")
 public class RepalLinkDTO {
-
-
-    @ApiModelProperty(value = "主键,联系人id")
+    @ApiModelProperty(value = "修改的时候传")
     private Long id;
 
     @ApiModelProperty(value = "联系人姓名")
@@ -33,14 +29,6 @@ public class RepalLinkDTO {
     @ApiModelProperty(value = "联系人微信")
     private String wechat;
 
-    @ApiModelProperty(value = "所属客户")
-    private Long custId;
-
-    @ApiModelProperty(value = "是否删除 0否 1是")
-    private Integer deleted;
-
-    @ApiModelProperty(value = "创建时间")
-    private LocalDateTime timeCreated;
 
 
 }

+ 21 - 0
src/main/java/com/winhc/repal/model/vo/RemindTypeUnReadCountVO.java

@@ -0,0 +1,21 @@
+package com.winhc.repal.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @Description: RemindTypeCountVO
+ * @Author: xda
+ * @Date: 2021/8/9 15:42
+ */
+@ApiModel("类型和未读数量")
+@Data
+public class RemindTypeUnReadCountVO {
+
+    @ApiModelProperty("类型")
+    private String remindType;
+
+    @ApiModelProperty("数量")
+    private Integer count;
+}

+ 36 - 0
src/main/java/com/winhc/repal/model/vo/RepalBillRemindUnReadVO.java

@@ -0,0 +1,36 @@
+package com.winhc.repal.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @Description: AccountBillRemindUnReadVO
+ * @Author: xda
+ * @Date: 2021/8/9 15:23
+ */
+@Data
+@ApiModel("未读数量")
+@AllArgsConstructor
+@NoArgsConstructor
+public class RepalBillRemindUnReadVO {
+
+    @ApiModelProperty("风险预警未读数量")
+    private Integer unreadRiskCount;
+
+    @ApiModelProperty("财产提醒未读数量")
+    private Integer unreadFinanceCount;
+
+    @ApiModelProperty("评级动态未读数量")
+    private Integer unreadRankCount;
+
+    @ApiModelProperty("逾期动态未读数量")
+    private Integer unreadOverdueCount;
+
+    @ApiModelProperty("未读总数")
+    private Integer unreadTotalCount;
+
+
+}

+ 20 - 13
src/main/java/com/winhc/repal/model/vo/RepalCustomerVO.java

@@ -1,12 +1,12 @@
 package com.winhc.repal.model.vo;
 
-import java.time.LocalDateTime;
-
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
+import java.util.List;
+
 /**
  * @description RepalCustomer VO对象
  * @author Generator
@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
 @Data
 @Accessors(chain = true)
 @ApiModel(value="RepalCustomer VO对象", description="回款宝客户表")
-public class RepalCustomerVO {
+public class RepalCustomerDetailVO {
 
     @ApiModelProperty(value = "客户id")
     private Long custId;
@@ -41,20 +41,27 @@ public class RepalCustomerVO {
     @ApiModelProperty(value = "备注信息")
     private String remark;
 
-    @ApiModelProperty(value = "所属用户")
-    private Long belongUserId;
+    @ApiModelProperty(value = "1客户  2供应商")
+    private Integer custType;
 
-    @ApiModelProperty(value = "是否删除 0否 1是")
-    private Integer deleted;
+    @ApiModelProperty("关联账款数量")
+    private Integer repalBillCount;
 
-    @ApiModelProperty(value = "创建时间")
-    private LocalDateTime timeCreated;
+    @ApiModelProperty(value = "待收/待付金额")
+    private String receivableStr;
 
-    @ApiModelProperty(value = "修改时间")
-    private LocalDateTime timeModified;
+    @ApiModelProperty("已逾期str")
+    private String totalOverdueStr;
 
-    @ApiModelProperty(value = "1客户  2供应商")
-    private Integer custType;
+    @ApiModelProperty(value = "账款总金额")
+    private String totalMoneyStr;
+
+    @ApiModelProperty(value = "已收回")
+    private String totalTransMoneyStr;
 
+    @ApiModelProperty(value = "负责人")
+    private List<RepalGroupMemberVO> charges;
 
+    @ApiModelProperty("未读动态数量依次是 逾期 风险预警 评级 财产")
+    private List<Integer> dynamicCountList;
 }

+ 46 - 0
src/main/java/com/winhc/repal/model/vo/RepalCustomerInfoVO.java

@@ -0,0 +1,46 @@
+package com.winhc.repal.model.vo;
+
+import java.util.List;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+/**
+ * @description RepalCustomer VO对象
+ * @author Generator
+ * @date 2022-04-08
+ */
+@Data
+@Accessors(chain = true)
+@ApiModel("回款宝客户")
+public class RepalCustomerInfoVO {
+
+    @ApiModelProperty(value = "客户id")
+    private Long custId;
+
+    @ApiModelProperty(value = "客户名称")
+    private String custName;
+
+    @ApiModelProperty(value = "客户性质 1企业 2个人 3政府事业单位")
+    private Integer custProperty;
+
+    @ApiModelProperty(value = "1客户  2供应商")
+    private Integer custType;
+
+    @ApiModelProperty("关联账款数量")
+    private Integer repalBillCount;
+
+    @ApiModelProperty(value = "账款总金额")
+    private String totalMoneyStr;
+
+    @ApiModelProperty(value = "待收/待付金额")
+    private String receivableStr;
+
+    @ApiModelProperty(value = "负责人")
+    private List<RepalGroupMemberVO> charges;
+
+    @ApiModelProperty("未读动态数量依次是 逾期 风险预警 评级 财产")
+    private List<Integer> dynamicCountList;
+}

+ 30 - 0
src/main/java/com/winhc/repal/model/vo/RepalGroupMemberVO.java

@@ -0,0 +1,30 @@
+package com.winhc.repal.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Aaron
+ * @date 2022/4/19 13:39
+ * @description
+ */
+@Data
+@ApiModel("回款宝-组织成员")
+public class RepalGroupMemberVO {
+
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @ApiModelProperty(value = "组织id")
+    private Long repalGroupId;
+
+    @ApiModelProperty(value = "用户id")
+    private Long userId;
+
+    @ApiModelProperty(value = "成员name")
+    private String memberUserName;
+
+    @ApiModelProperty(value = "角色类型。1系统角色。2自定义角色")
+    private Integer roleType;
+}

+ 26 - 0
src/main/java/com/winhc/repal/model/vo/RepalOperLogContentVO.java

@@ -0,0 +1,26 @@
+package com.winhc.repal.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author Aaron
+ * @date 2022/4/24 18:15
+ * @description
+ */
+@Data
+@ApiModel("修改记录")
+public class RepalOperLogContentVO {
+    @ApiModelProperty("属性")
+    private String propertyName;
+
+    @ApiModelProperty("属性中文名称")
+    private String propertyCN;
+
+    @ApiModelProperty("旧值")
+    private String oldValue;
+
+    @ApiModelProperty("新值")
+    private String newValue;
+}

+ 46 - 0
src/main/java/com/winhc/repal/model/vo/RepalSupplyInfoVO.java

@@ -0,0 +1,46 @@
+package com.winhc.repal.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * @description RepalCustomer VO对象
+ * @author Generator
+ * @date 2022-04-08
+ */
+@Data
+@Accessors(chain = true)
+@ApiModel("回款宝供应商")
+public class RepalSupplyInfoVO {
+
+    @ApiModelProperty(value = "供应商id")
+    private Long custId;
+
+    @ApiModelProperty(value = "供应商名称")
+    private String custName;
+
+    @ApiModelProperty(value = "供应商性质 1企业 2个人 3政府事业单位")
+    private Integer custProperty;
+
+    @ApiModelProperty(value = "1客户  2供应商")
+    private Integer custType;
+
+    @ApiModelProperty("关联账款数量")
+    private Integer repalBillCount;
+
+    @ApiModelProperty(value = "账款总金额")
+    private String totalMoneyStr;
+
+    @ApiModelProperty(value = "待收金额")
+    private String receivableStr;
+
+    @ApiModelProperty(value = "负责人")
+    private List<RepalGroupMemberVO> charges;
+
+    @ApiModelProperty("未读动态数量依次是 逾期 风险预警 评级 财产")
+    private List<Integer> dynamicCountList;
+}

+ 18 - 1
src/main/java/com/winhc/repal/repository/RepalCustomerMapper.java

@@ -1,13 +1,30 @@
 package com.winhc.repal.repository;
 
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.winhc.repal.entity.RepalCustomer;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.winhc.repal.model.bo.RepalCustomerInfoBO;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
 
 /**
  * @description RepalCustomer Mapper 接口
  * @author Generator
  * @date 2022-04-08
  */
+@Repository
 public interface RepalCustomerMapper extends BaseMapper<RepalCustomer> {
-
+    /**
+     * 分页查客户
+     * @param page
+     * @param groupId
+     * @param custProperty
+     * @param sortType
+     * @return
+     */
+    Page<RepalCustomerInfoBO> getCustPage(Page<RepalCustomerInfoBO> page,
+                                          @Param("groupId") Long groupId,
+                                          @Param("custProperty")Integer custProperty,
+                                          @Param("sortType")Integer sortType,
+                                          @Param("custType")Integer custType);
 }

+ 7 - 1
src/main/java/com/winhc/repal/repository/RepalRemindHistoryMapper.java

@@ -2,12 +2,18 @@ package com.winhc.repal.repository;
 
 import com.winhc.repal.entity.RepalRemindHistory;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.winhc.repal.model.vo.RemindTypeUnReadCountVO;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
 
 /**
  * @description RepalRemindHistory Mapper 接口
  * @author Generator
  * @date 2022-04-08
  */
+@Repository
 public interface RepalRemindHistoryMapper extends BaseMapper<RepalRemindHistory> {
-
+    List<RemindTypeUnReadCountVO> getRemindUnReadVO(@Param("repalBillIds")List<Long> repalBillIds);
 }

+ 38 - 41
src/main/java/com/winhc/repal/service/RepalCustomerService.java

@@ -1,11 +1,14 @@
 package com.winhc.repal.service;
 
+import com.module.login.usersession.UserBean;
 import com.winhc.repal.entity.RepalCustomer;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.winhc.common.model.base.VOPage;
 import com.winhc.repal.model.dto.RepalCustomerDTO;
-import com.winhc.repal.model.vo.RepalCustomerVO;
-import java.util.List;
+import com.winhc.repal.model.dto.RepalCustomerQueryDTO;
+import com.winhc.repal.model.dto.RepalCustomerUpdateDTO;
+import com.winhc.repal.model.vo.RepalCustomerDetailVO;
+import com.winhc.repal.model.vo.RepalCustomerInfoVO;
 
 
 /**
@@ -15,45 +18,39 @@ import java.util.List;
  */
 public interface RepalCustomerService extends IService<RepalCustomer> {
 
-    /**
-    * add RepalCustomer
-    * @param dto data transfer object
-    */
-    void add(RepalCustomerDTO dto);
-
-    /**
-    * update RepalCustomer
-    * @param custId key
-    * @param dto data transfer object
-    */
-    void update(Long custId, RepalCustomerDTO dto);
-
-    /**
-    * delete RepalCustomer
-    * @param custId key
-    */
-    void delete(Long custId);
-
-    /**
-    * find RepalCustomer
-    * @param custId key
-    * @return RepalCustomer
-    */
-    RepalCustomerVO find(Long custId);
-
-    /**
-    * find RepalCustomer list
-    * @param dto data transfer object
-    * @return list of RepalCustomer
-    */
-    List<RepalCustomerVO> find(RepalCustomerDTO dto);
+     /**
+      * 分页查询客户
+      * @param dto
+      * @return
+      */
+     VOPage<RepalCustomerInfoVO> find(RepalCustomerQueryDTO dto);
+
+     /**
+      * 添加客户
+      * @param dto
+      * @return
+      */
+     RepalCustomerDetailVO addCustomer(RepalCustomerDTO dto,UserBean userBean);
+
+     /**
+      * 修改客户
+      * @param dto
+      * @param userBean
+      * @return
+      */
+     RepalCustomerDetailVO updateCustomer(RepalCustomerUpdateDTO dto, UserBean userBean);
+
+     /**
+      * 根据id查询客户详情
+      * @param custId
+      * @return
+      */
+     RepalCustomerDetailVO getDetailById(Long custId);
 
      /**
-     * find RepalCustomer page
-     * @param dto data transfer object
-     * @param pageNum page number
-     * @param pageSize page size
-     * @return page of RepalCustomer
-     */
-     VOPage<RepalCustomerVO> find(RepalCustomerDTO dto, Integer pageNum, Integer pageSize);
+      * 删除客户/供应商
+      * @param custId
+      * @return
+      */
+     Boolean deleteCustomer(Long custId, UserBean userBean);
 }

+ 6 - 43
src/main/java/com/winhc/repal/service/RepalRemindHistoryService.java

@@ -2,9 +2,8 @@ package com.winhc.repal.service;
 
 import com.winhc.repal.entity.RepalRemindHistory;
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.winhc.common.model.base.VOPage;
-import com.winhc.repal.model.dto.RepalRemindHistoryDTO;
-import com.winhc.repal.model.vo.RepalRemindHistoryVO;
+import com.winhc.repal.model.vo.RepalBillRemindUnReadVO;
+
 import java.util.List;
 
 
@@ -14,46 +13,10 @@ import java.util.List;
  * @date 2022-04-08
  */
 public interface RepalRemindHistoryService extends IService<RepalRemindHistory> {
-
-    /**
-    * add RepalRemindHistory
-    * @param dto data transfer object
-    */
-    void add(RepalRemindHistoryDTO dto);
-
-    /**
-    * update RepalRemindHistory
-    * @param id key
-    * @param dto data transfer object
-    */
-    void update(Long id, RepalRemindHistoryDTO dto);
-
     /**
-    * delete RepalRemindHistory
-    * @param id key
-    */
-    void delete(Long id);
-
-    /**
-    * find RepalRemindHistory
-    * @param id key
-    * @return RepalRemindHistory
-    */
-    RepalRemindHistoryVO find(Long id);
-
-    /**
-    * find RepalRemindHistory list
-    * @param dto data transfer object
-    * @return list of RepalRemindHistory
-    */
-    List<RepalRemindHistoryVO> find(RepalRemindHistoryDTO dto);
-
-     /**
-     * find RepalRemindHistory page
-     * @param dto data transfer object
-     * @param pageNum page number
-     * @param pageSize page size
-     * @return page of RepalRemindHistory
+     * 查询未读数量
+     * @param repalBillIds
+     * @return
      */
-     VOPage<RepalRemindHistoryVO> find(RepalRemindHistoryDTO dto, Integer pageNum, Integer pageSize);
+    RepalBillRemindUnReadVO getRemindUnReadVO(List<Long> repalBillIds);
 }

+ 354 - 23
src/main/java/com/winhc/repal/service/impl/RepalCustomerServiceImpl.java

@@ -1,21 +1,39 @@
 package com.winhc.repal.service.impl;
 
-import com.winhc.repal.entity.RepalCustomer;
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.module.login.usersession.UserBean;
+import com.winhc.common.enums.CodeMsg;
+import com.winhc.common.exception.CommonException;
+import com.winhc.repal.entity.*;
+import com.winhc.repal.enums.Dict;
+import com.winhc.repal.model.bo.RepalCustomerInfoBO;
+import com.winhc.repal.model.dto.*;
+import com.winhc.repal.model.vo.*;
 import com.winhc.repal.repository.RepalCustomerMapper;
-import com.winhc.repal.service.RepalCustomerService;
+import com.winhc.repal.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.winhc.common.model.base.VOPage;
-import com.winhc.repal.model.dto.RepalCustomerDTO;
 import com.winhc.repal.model.cvt.RepalCustomerConvert;
-import com.winhc.repal.model.vo.RepalCustomerVO;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.time.LocalDateTime;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.function.Function;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 /**
  * @description RepalCustomer 接口实现类
@@ -24,37 +42,350 @@ import java.util.stream.Collectors;
  */
 @Service
 public class RepalCustomerServiceImpl extends ServiceImpl<RepalCustomerMapper, RepalCustomer> implements RepalCustomerService {
+    @Autowired
+    private RepalCustomerMapper repalCustomerMapper;
 
-    @Override
-    public void add(RepalCustomerDTO dto) {
-        save(RepalCustomerConvert.DTOToEntity(dto));
+    @Autowired
+    private RepalBillService repalBillService;
+
+    @Autowired
+    private RepalBillOperLogService repalBillOperLogService;
+
+    @Autowired
+    private RepalCustChargeRelService repalCustChargeRelService;
+
+    @Autowired
+    private RepalGroupMemberService repalGroupMemberService;
+
+    @Autowired
+    private RepalRemindHistoryService repalRemindHistoryService;
+
+    @Autowired
+    private RepalLinkService repalLinkService;
+
+     @Override
+     public VOPage<RepalCustomerInfoVO> find(RepalCustomerQueryDTO dto) {
+         Page<RepalCustomerInfoBO> page = new Page<>(dto.getPageNum(),dto.getPageSize());
+         page = repalCustomerMapper.getCustPage(page, dto.getRepalGroupId(),dto.getCustProperty(),dto.getSortType(),dto.getCustType());
+         VOPage<RepalCustomerInfoVO> result = new VOPage<>(dto.getPageNum(), dto.getPageSize(), page.getTotal(), new ArrayList<>());
+         if(CollUtil.isEmpty(page.getRecords())){
+             return result;
+         }
+         //查询负责人
+         List<Long> custIds = page.getRecords().stream().map(RepalCustomerInfoBO::getCustId).collect(Collectors.toList());
+         List<RepalCustChargeRel> rels = repalCustChargeRelService.list(Wrappers.lambdaQuery(RepalCustChargeRel.class)
+                 .in(RepalCustChargeRel::getCustId,custIds));
+         Map<Long, List<RepalCustChargeRel>> relMap = rels.stream().collect(Collectors.groupingBy(RepalCustChargeRel::getCustId));
+         Map<Long, RepalGroupMember> memberMap = repalGroupMemberService.list(Wrappers.lambdaQuery(RepalGroupMember.class)
+                 .in(RepalGroupMember::getUserId,rels.stream().map(RepalCustChargeRel::getMemberId).collect(Collectors.toList())))
+                 .stream().collect(Collectors.toMap(RepalGroupMember::getUserId,Function.identity()));
+         List<RepalCustomerInfoVO> voList = new ArrayList<>();
+         for(RepalCustomerInfoBO customerInfo:page.getRecords()){
+             RepalCustomerInfoVO vo = new RepalCustomerInfoVO();
+             BeanUtils.copyProperties(customerInfo,vo);
+             vo.setReceivableStr(customerInfo.getReceivable().stripTrailingZeros().toPlainString());
+             vo.setTotalMoneyStr(customerInfo.getTotalMoney().stripTrailingZeros().toPlainString());
+             //查询未读动态数量
+             List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class)
+                     .eq(RepalBill::getCustomerId,customerInfo.getCustId())
+                     .eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
+             if(CollUtil.isNotEmpty(repalBills)) {
+                 RepalBillRemindUnReadVO unRead = repalRemindHistoryService.getRemindUnReadVO(repalBills.stream().map(RepalBill::getId).collect(Collectors.toList()));
+                 if(ObjectUtil.isNotNull(unRead) && unRead.getUnreadTotalCount() > 0){
+                     vo.setDynamicCountList(Stream.of(unRead.getUnreadOverdueCount(),unRead.getUnreadRiskCount(), unRead.getUnreadRankCount(), unRead.getUnreadFinanceCount()).collect(Collectors.toList()));
+                 }
+             }
+             //负责人
+             if(relMap.containsKey(customerInfo.getCustId())){
+                 List<RepalCustChargeRel> repalCustChargeRels = relMap.get(customerInfo.getCustId());
+                 List<RepalGroupMemberVO> memberList = new ArrayList<>();
+                 vo.setCharges(memberList);
+                 for(RepalCustChargeRel rel:repalCustChargeRels){
+                     RepalGroupMemberVO member = new RepalGroupMemberVO();
+                     memberList.add(member);
+                     RepalGroupMember groupMember = memberMap.getOrDefault(rel.getMemberId(),new RepalGroupMember());
+                     member.setMemberUserName(groupMember.getMemberUserName());
+                     member.setUserId(groupMember.getUserId());
+                     member.setId(groupMember.getId());
+                     member.setRepalGroupId(groupMember.getRepalGroupId());
+                     member.setRoleType(groupMember.getRoleType());
+                 }
+             }
+             voList.add(vo);
+         }
+         result.setDataList(voList);
+         return result;
     }
 
     @Override
-    public void update(Long custId, RepalCustomerDTO dto) {
-        update(RepalCustomerConvert.DTOToEntity(dto),new UpdateWrapper<RepalCustomer>().lambda().eq(RepalCustomer::getCustId,custId));
+    @Transactional
+    public RepalCustomerDetailVO addCustomer(RepalCustomerDTO dto,UserBean userBean) {
+        RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class)
+                .eq(RepalGroupMember::getUserId,userBean.getUserId())
+                .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false);
+        if(ObjectUtil.isNull(repalGroupMember)){
+            throw new CommonException(CodeMsg.FAILED,"您没有新增客户的权限");
+        }
+        //todo 其他校验权限
+
+         RepalCustomer repalCustomer = new RepalCustomer();
+         BeanUtils.copyProperties(dto,repalCustomer);
+         repalCustomer.setRepalGroupId(repalGroupMember.getRepalGroupId());
+         //校验非空字段
+         if(StrUtil.isBlank(dto.getCustName())){
+             throw new CommonException(CodeMsg.FAILED,"客户名不能为空");
+         }
+        if(ObjectUtil.isNull(dto.getCustProperty())){
+            throw new CommonException(CodeMsg.FAILED,"客户性质不能为空");
+        }
+        if(StrUtil.isBlank(dto.getIndustry())){
+            throw new CommonException(CodeMsg.FAILED,"所属行业不能为空");
+        }
+         save(repalCustomer);
+
+         //保存联系人
+         if(CollUtil.isNotEmpty(dto.getLinks())){
+             List<RepalLink> links = new ArrayList<>();
+             for(RepalLinkDTO linkDto: dto.getLinks()){
+                 RepalLink link = new RepalLink();
+                 BeanUtils.copyProperties(linkDto,link);
+                 link.setCustId(repalCustomer.getCustId());
+                 links.add(link);
+             }
+             repalLinkService.saveBatch(links);
+         }
+         //保存客户和负责人的关系
+         if(CollUtil.isNotEmpty(dto.getCharges())){
+             List<RepalCustChargeRel> rels = new ArrayList<>();
+             for(Long relUserId: dto.getCharges()){
+                 RepalCustChargeRel rel =  new RepalCustChargeRel();
+                 rel.setCustId(repalCustomer.getCustId());
+                 rel.setMemberId(relUserId);
+                 rels.add(rel);
+             }
+             repalCustChargeRelService.saveBatch(rels);
+         }
+         //添加操作日志
+         Dict.ActionCodeEnum actionCodeEnum = Dict.ActionCodeEnum.新增客户;
+         if(Dict.custTypeEnum.供应商.getCode().equals(dto.getCustType())){
+             actionCodeEnum = Dict.ActionCodeEnum.新增供应商;
+         }
+         RepalBillOperLog repalBillOperLog = new RepalBillOperLog();
+         repalBillOperLog.setActionCode(actionCodeEnum.getCode());
+         repalBillOperLog.setUserId(userBean.getUserId());
+         repalBillOperLog.setOperTime(LocalDateTime.now());
+         repalBillOperLog.setBizId(String.valueOf(repalCustomer.getCustId()));
+         repalBillOperLog.setBizType(actionCodeEnum.getBizType());
+         repalBillOperLog.setActionName(actionCodeEnum.name());
+         repalBillOperLogService.save(repalBillOperLog);
+         return getDetailById(repalCustomer.getCustId());
     }
 
     @Override
-    public void delete(Long custId) {
-        removeById(custId);
+    public RepalCustomerDetailVO updateCustomer(RepalCustomerUpdateDTO dto, UserBean userBean) {
+        RepalGroupMember repalGroupMember = repalGroupMemberService.getOne(Wrappers.lambdaQuery(RepalGroupMember.class)
+                .eq(RepalGroupMember::getUserId,userBean.getUserId())
+                .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()),false);
+        if(ObjectUtil.isNull(repalGroupMember)){
+            throw new CommonException(CodeMsg.FAILED,"您没有新增客户的权限");
+        }
+        //todo 其他校验权限
+
+        RepalCustomer repalCustomer = getById(dto.getCustId());
+        if(ObjectUtil.isNull(repalCustomer)){
+            throw new CommonException(CodeMsg.FAILED,"客户或供应商不存在");
+        }
+        RepalBillOperLog repalBillOperLog = new RepalBillOperLog();
+        List<RepalOperLogContentVO> operLogContents = new ArrayList<>();
+        if(!ObjectUtil.equal(repalCustomer.getCustName(),dto.getCustName())){
+            RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
+            contentVO.setPropertyName("custName");
+            contentVO.setPropertyCN("客户名称");
+            contentVO.setOldValue(repalCustomer.getCustName());
+            contentVO.setNewValue(dto.getCustName());
+            operLogContents.add(contentVO);
+
+            repalCustomer.setCustName(dto.getCustName());
+            repalCustomer.setCompanyId(dto.getCompanyId());
+        }
+
+        if(!ObjectUtil.equal(repalCustomer.getCustProperty(),dto.getCustProperty())){
+            RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
+            contentVO.setPropertyName("custProperty");
+            contentVO.setPropertyCN("客户性质");
+            contentVO.setOldValue(String.valueOf(repalCustomer.getCustProperty()));
+            contentVO.setNewValue(String.valueOf(dto.getCustProperty()));
+            operLogContents.add(contentVO);
+
+            repalCustomer.setCustProperty(dto.getCustProperty());
+        }
+
+        if(!ObjectUtil.equal(repalCustomer.getIndustry(),dto.getIndustry())){
+            RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
+            contentVO.setPropertyName("industry");
+            contentVO.setPropertyCN("所属行业");
+            contentVO.setOldValue(repalCustomer.getIndustry());
+            contentVO.setNewValue(dto.getIndustry());
+            operLogContents.add(contentVO);
+
+            repalCustomer.setIndustry(dto.getIndustry());
+        }
+
+        if(!ObjectUtil.equal(repalCustomer.getIndustry(),dto.getIndustry())){
+            RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
+            contentVO.setPropertyName("address");
+            contentVO.setPropertyCN("办公地址");
+            contentVO.setOldValue(repalCustomer.getAddress());
+            contentVO.setNewValue(dto.getAddress());
+            operLogContents.add(contentVO);
+
+            repalCustomer.setAddress(dto.getAddress());
+        }
+
+        if(!ObjectUtil.equal(repalCustomer.getAttachment(),dto.getAttachment())){
+            RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
+            contentVO.setPropertyName("attachment");
+            contentVO.setPropertyCN("附件");
+            contentVO.setOldValue(repalCustomer.getAttachment());
+            contentVO.setNewValue(dto.getAttachment());
+            operLogContents.add(contentVO);
+
+            repalCustomer.setAttachment(dto.getAttachment());
+        }
+
+        if(!ObjectUtil.equal(repalCustomer.getRemark(),dto.getRemark())){
+            RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
+            contentVO.setPropertyName("remark");
+            contentVO.setPropertyCN("备注信息");
+            contentVO.setOldValue(repalCustomer.getRemark());
+            contentVO.setNewValue(dto.getRemark());
+            operLogContents.add(contentVO);
+
+            repalCustomer.setRemark(dto.getRemark());
+        }
+
+        updateById(repalCustomer);
+
+        if(CollUtil.isNotEmpty(dto.getCharges())){
+            List<RepalCustChargeRel> rels = repalCustChargeRelService.list(Wrappers.lambdaQuery(RepalCustChargeRel.class).eq(RepalCustChargeRel::getCustId,dto.getCustId()));
+            List<RepalGroupMember> members = new ArrayList<>();
+            //删除旧负责人
+            if(CollUtil.isNotEmpty(rels)){
+                repalCustChargeRelService.removeByIds(rels.stream().map(RepalCustChargeRel::getId).collect(Collectors.toList()));
+                members = repalGroupMemberService.list(Wrappers.lambdaQuery(RepalGroupMember.class)
+                        .in(RepalGroupMember::getUserId,rels.stream().map(RepalCustChargeRel::getMemberId).collect(Collectors.toList()))
+                        .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
+            }
+            List<RepalGroupMember> newMembers = repalGroupMemberService.list(Wrappers.lambdaQuery(RepalGroupMember.class)
+                    .in(RepalGroupMember::getUserId,dto.getCharges())
+                    .eq(RepalGroupMember::getDeleted,Dict.DeletedStatusEnunm.否.getCode()));
+            //新增负责人
+            List<RepalCustChargeRel> newRels = new ArrayList<>();
+            for(Long relUserId: dto.getCharges()){
+                RepalCustChargeRel rel =  new RepalCustChargeRel();
+                rel.setCustId(repalCustomer.getCustId());
+                rel.setMemberId(relUserId);
+                newRels.add(rel);
+            }
+            repalCustChargeRelService.saveBatch(newRels);
+
+            RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
+            contentVO.setPropertyName("charges");
+            contentVO.setPropertyCN("负责人");
+            contentVO.setOldValue(JSON.toJSONString(members.stream().map(RepalGroupMember::getMemberUserName).collect(Collectors.toList())));
+            contentVO.setNewValue(JSON.toJSONString(newMembers.stream().map(RepalGroupMember::getMemberUserName).collect(Collectors.toList())));
+            operLogContents.add(contentVO);
+        }
+
+        if(CollUtil.isNotEmpty(dto.getLinks())){
+            List<RepalLink> links = repalLinkService.list(Wrappers.lambdaQuery(RepalLink.class).eq(RepalLink::getCustId,dto.getCustId()).eq(RepalLink::getDeleted,Dict.DeletedStatusEnunm.是.getCode()));
+            //遍历修改老数据
+            if(CollUtil.isNotEmpty(links)){
+                for(RepalLink repalLink:links){
+                    Optional<RepalLinkDTO> optionalRepalLink = dto.getLinks().stream().filter(x->repalLink.getId().equals(x.getId())).findFirst();
+                    if(optionalRepalLink.isPresent()){
+                        BeanUtils.copyProperties(optionalRepalLink.get(),repalLink);
+                    }else {
+                        repalLink.setDeleted(Dict.DeletedStatusEnunm.是.getCode());
+                    }
+                    repalLinkService.updateById(repalLink);
+                }
+            }
+            //遍历新数据
+            List<RepalLink> newlinks = new ArrayList<>();
+            for(RepalLinkDTO linkDto: dto.getLinks()){
+                if(ObjectUtil.isNotNull(linkDto.getId())){
+                    continue;
+                }
+                RepalLink link = new RepalLink();
+                BeanUtils.copyProperties(linkDto,link);
+                link.setCustId(repalCustomer.getCustId());
+                newlinks.add(link);
+            }
+            repalLinkService.saveBatch(newlinks);
+
+            RepalOperLogContentVO contentVO = new RepalOperLogContentVO();
+            contentVO.setPropertyName("links");
+            contentVO.setPropertyCN("联系人");
+            contentVO.setOldValue(JSON.toJSONString(links));
+            contentVO.setNewValue(JSON.toJSONString(dto.getLinks()));
+            operLogContents.add(contentVO);
+        }
+
+        Dict.ActionCodeEnum actionCodeEnum = Dict.ActionCodeEnum.修改客户;
+        if(Dict.custTypeEnum.供应商.getCode().equals(repalCustomer.getCustType())){
+            actionCodeEnum = Dict.ActionCodeEnum.修改供应商;
+        }
+        repalBillOperLog.setActionCode(actionCodeEnum.getCode());
+        repalBillOperLog.setUserId(userBean.getUserId());
+        repalBillOperLog.setOperTime(LocalDateTime.now());
+        repalBillOperLog.setBizId(String.valueOf(dto.getCustId()));
+        repalBillOperLog.setBizType(actionCodeEnum.getBizType());
+        repalBillOperLog.setActionName(actionCodeEnum.name());
+        repalBillOperLog.setActionContent(JSON.toJSONString(operLogContents));
+        repalBillOperLogService.save(repalBillOperLog);
+        return getDetailById(dto.getCustId());
     }
 
     @Override
-    public RepalCustomerVO find(Long custId) {
-        return RepalCustomerConvert.EntityToVO(getById(custId));
+    public RepalCustomerDetailVO getDetailById(Long custId) {
+        return null;
     }
 
     @Override
-    public List<RepalCustomerVO> find(RepalCustomerDTO dto) {
-        return list(new QueryWrapper<>(RepalCustomerConvert.DTOToEntity(dto))).stream().map(RepalCustomerConvert::EntityToVO)
-                 .collect(Collectors.toList());
-    }
+    @Transactional
+    public Boolean deleteCustomer(Long custId, UserBean userBean) {
+        //删除客户
+        RepalCustomer repalCustomer = getById(custId);
+        if(ObjectUtil.isNull(custId)){
+            throw new CommonException(CodeMsg.FAILED,"客户或供应商不存在");
+        }
+        //todo 权限判断
 
-     @Override
-     public VOPage<RepalCustomerVO> find(RepalCustomerDTO dto, Integer pageNum, Integer pageSize) {
-         IPage<RepalCustomer> pageRepalCustomer = page(new Page<>(pageNum, pageSize), new QueryWrapper<>(RepalCustomerConvert.DTOToEntity(dto)));
-         return new VOPage<>(pageNum,pageSize,pageRepalCustomer.getTotal(), pageRepalCustomer.getRecords().stream()
-                 .map(RepalCustomerConvert::EntityToVO).collect(Collectors.toList()));
+        repalCustomer.setDeleted(Dict.DeletedStatusEnunm.是.getCode());
+        updateById(repalCustomer);
+        //删除客户对应的账款
+        List<RepalBill> repalBills = repalBillService.list(Wrappers.lambdaQuery(RepalBill.class)
+                .eq(RepalBill::getCustomerId,custId)
+                .eq(RepalBill::getDeleted, Dict.DeletedStatusEnunm.否.getCode()));
+        if(CollUtil.isNotEmpty(repalBills)){
+            for(RepalBill repalBill:repalBills){
+                repalBillService.deleteRepalBillById(new DeleteRepalBillDTO().setRepalBillId(repalBill.getId()));
+            }
+        }
+        //操作记录
+        Dict.ActionCodeEnum actionCodeEnum = Dict.ActionCodeEnum.删除客户;
+        if(Dict.custTypeEnum.供应商.getCode().equals(repalCustomer.getCustType())){
+            actionCodeEnum = Dict.ActionCodeEnum.删除供应商;
+        }
+        RepalBillOperLog repalBillOperLog = new RepalBillOperLog();
+        repalBillOperLog.setActionCode(actionCodeEnum.getCode());
+        repalBillOperLog.setUserId(userBean.getUserId());
+        repalBillOperLog.setOperTime(LocalDateTime.now());
+        repalBillOperLog.setBizId(String.valueOf(custId));
+        repalBillOperLog.setBizType(actionCodeEnum.getBizType());
+        repalBillOperLog.setActionName(actionCodeEnum.name());
+        repalBillOperLogService.save(repalBillOperLog);
+        return Boolean.TRUE;
     }
 }

+ 31 - 30
src/main/java/com/winhc/repal/service/impl/RepalRemindHistoryServiceImpl.java

@@ -1,9 +1,15 @@
 package com.winhc.repal.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import com.winhc.repal.entity.RepalRemindHistory;
+import com.winhc.repal.enums.Dict;
+import com.winhc.repal.model.vo.RemindTypeUnReadCountVO;
+import com.winhc.repal.model.vo.RepalBillRemindUnReadVO;
 import com.winhc.repal.repository.RepalRemindHistoryMapper;
 import com.winhc.repal.service.RepalRemindHistoryService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -24,37 +30,32 @@ import java.util.stream.Collectors;
  */
 @Service
 public class RepalRemindHistoryServiceImpl extends ServiceImpl<RepalRemindHistoryMapper, RepalRemindHistory> implements RepalRemindHistoryService {
+    @Autowired
+    private RepalRemindHistoryMapper repalRemindHistoryMapper;
 
     @Override
-    public void add(RepalRemindHistoryDTO dto) {
-        save(RepalRemindHistoryConvert.DTOToEntity(dto));
-    }
-
-    @Override
-    public void update(Long id, RepalRemindHistoryDTO dto) {
-        update(RepalRemindHistoryConvert.DTOToEntity(dto),new UpdateWrapper<RepalRemindHistory>().lambda().eq(RepalRemindHistory::getId,id));
-    }
-
-    @Override
-    public void delete(Long id) {
-        removeById(id);
-    }
-
-    @Override
-    public RepalRemindHistoryVO find(Long id) {
-        return RepalRemindHistoryConvert.EntityToVO(getById(id));
-    }
-
-    @Override
-    public List<RepalRemindHistoryVO> find(RepalRemindHistoryDTO dto) {
-        return list(new QueryWrapper<>(RepalRemindHistoryConvert.DTOToEntity(dto))).stream().map(RepalRemindHistoryConvert::EntityToVO)
-                 .collect(Collectors.toList());
-    }
-
-     @Override
-     public VOPage<RepalRemindHistoryVO> find(RepalRemindHistoryDTO dto, Integer pageNum, Integer pageSize) {
-         IPage<RepalRemindHistory> pageRepalRemindHistory = page(new Page<>(pageNum, pageSize), new QueryWrapper<>(RepalRemindHistoryConvert.DTOToEntity(dto)));
-         return new VOPage<>(pageNum,pageSize,pageRepalRemindHistory.getTotal(), pageRepalRemindHistory.getRecords().stream()
-                 .map(RepalRemindHistoryConvert::EntityToVO).collect(Collectors.toList()));
+    public RepalBillRemindUnReadVO getRemindUnReadVO(List<Long> repalBillIds) {
+        RepalBillRemindUnReadVO result = new RepalBillRemindUnReadVO(0,0,0,0,0);
+        List<RemindTypeUnReadCountVO> unReadCounts = repalRemindHistoryMapper.getRemindUnReadVO(repalBillIds);
+        if (CollUtil.isEmpty(unReadCounts)) {
+            // 没有未读
+            return result;
+        }
+        unReadCounts.forEach(countVO -> {
+            if (Dict.RemindEnum.风险预警.name().equals(countVO.getRemindType())) {
+                result.setUnreadRiskCount(countVO.getCount());
+            }
+            if (Dict.RemindEnum.财产线索.name().equals(countVO.getRemindType())) {
+                result.setUnreadFinanceCount(countVO.getCount());
+            }
+            if (Dict.RemindEnum.账款评级.name().equals(countVO.getRemindType())) {
+                result.setUnreadRankCount(countVO.getCount());
+            }
+            if (Dict.RemindEnum.逾期提醒.name().equals(countVO.getRemindType())) {
+                result.setUnreadOverdueCount(countVO.getCount());
+            }
+        });
+        result.setUnreadTotalCount(unReadCounts.stream().mapToInt(RemindTypeUnReadCountVO::getCount).sum());
+        return result;
     }
 }

+ 34 - 0
src/main/resources/mapper/RepalCustomerMapper.xml

@@ -2,4 +2,38 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.winhc.repal.repository.RepalCustomerMapper">
 
+    <select id="getCustPage" resultType="com.winhc.repal.model.bo.RepalCustomerInfoBO">
+        SELECT
+            A.CUST_ID as custId,
+            A.CUST_NAME as custName,
+            A.CUST_PROPERTY as custProperty,
+            A.CUST_TYPE as custType,
+            COUNT(*) as repalBillCount,
+            SUM(B.TOTAL_MONEY) as totalMoney,
+            SUM(B.RECEIVABLE) as receivable
+        FROM
+            REPAL_CUSTOMER A
+                LEFT JOIN REPAL_BILL B ON A.CUST_ID = B.CUSTOMER_ID
+                AND B.DELETED = 0
+        WHERE A.CUST_TYPE = 1
+        AND A.REPAL_GROUP_ID = #{groupId}
+        AND A.REPAL_BILL_TYPE = 1
+        AND A.CUST_TYPE = #{custType}
+        <if test="custProperty != null">
+            A.CUST_PROPERTY = #{custProperty}
+        </if>
+        GROUP BY A.CUST_ID
+        <if test="sortType == 2 ">
+            ORDER BY repalBillCount ASC
+        </if>
+        <if test="sortType == 3 ">
+            ORDER BY repalBillCount DESC
+        </if>
+        <if test="sortType == 4 ">
+            ORDER BY totalMoney ASC
+        </if>
+        <if test="sortType == 5 ">
+            ORDER BY totalMoney DESC
+        </if>
+    </select>
 </mapper>

+ 15 - 0
src/main/resources/mapper/RepalRemindHistoryMapper.xml

@@ -2,4 +2,19 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.winhc.repal.repository.RepalRemindHistoryMapper">
 
+    <select id="getRemindUnReadVO" resultType="com.winhc.repal.model.vo.RemindTypeUnReadCountVO">
+        SELECT
+            REMIND_TYPE AS remindType,
+            COUNT(*) AS count
+        FROM
+            REPAL_REMIND_HISTORY
+        WHERE
+            REPAL_BILL_ID IN
+        <foreach item="item" collection="repalBillIds" index="item" separator="," open="(" close=")">
+            #{item}
+        </foreach>
+        AND READ_STATUS = 0
+        GROUP BY
+            REMIND_TYPE
+    </select>
 </mapper>